Skaffoldの使用概要

32328 ワード

Skaffoldの使用概要


1、紹介


Skaffoldはkubernetes上のアプリケーション開発にCDサポートを提供するコマンドラインツールです.skaffoldを使用すると、ローカルコードをkubernetesに簡単に配備してテストすることができます.skaffoldを通ります.yamlでは、プロジェクトの構築(build)と導入(deploy)プロセスを管理できます.また、各シナリオが異なるコンストラクション(build)プロセスとデプロイ(deploy)プロセスに対応し、異なるシーンに基づいて選択される複数のシナリオ(profile)を定義することもできます.

2、使い方


2.1、環境説明

  • Skaffold version: v0.21.1
  • Operating system: macOS 10.14.3 Darwin Kernel Version 18.2.0
  • Kubernetes version: v1.13.0
  • Kubectl version: v1.10.11
  • Helm version: Client: v2.12.3、Server: v2.12.1
  • プロジェクト構造説明:
  • core                              --  
    core/chart                        -- helm chart 
    core/src                          --  
    core/src/main
    core/src/main/java
    core/src/main/resources           --  
    core/src/main/resources/a.txt     -- sync 
    core/build.gradle
    core/kubernetes-cloud-boot.yml    --  kubernetes 
    core/b.txt                        -- sync 
    core/Dockerfile                   -- Dockerfile 
    core/skaffold.yaml                -- skaffold 
    

    2.2、ソフトウェアのインストール


    ソフトウェアのインストールは比較的に簡単で、必要なkubectl、helm、skaffoldはすべて直接実行可能なバイナリファイルで、dockerのインストールも比較的に簡単で、ステップはもう説明しません~

    2.3、使用マニュアル

  • Skaffoldのほとんどの操作はskaffold.yamlファイルに集中し、skaffold.yamlファイルを編集し、skaffoldコマンドを実行すれば
  • になる.
  • Skaffoldの使い方は公式文書の構造と順序で記録~
  • 2.3.1、Using builders


    #####2.3.1.1、jibで構築
  • gradle+jibを使用してコンパイル、パッケージング、ミラーリングを行い、まずbuildを見てみましょう.gradleファイルの内容:
  • plugins {
        id 'java'
        id "org.springframework.boot" version "2.1.2.RELEASE"
        id 'com.google.cloud.tools.jib' version '1.0.0'
    }
    
    group 'com.chenlei.boot'
    version '1.0-SNAPSHOT'
    
    sourceCompatibility = 1.8
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
        compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.1.2.RELEASE'
    }
    
    jib {
        container {
            useCurrentTimestamp = true
            jvmFlags = ['-Dfile.encoding=UTF-8']
        }
        from {
            image = '192.168.101.88:5000/distroless/java:latest'
        }
        to {
            image = "192.168.101.88:5000/${project.name}:${version}"
        }
    }
    
  • ここではまずskaffoldを用いてbuildを行い、deployは以下に説明するskaffold.yamlファイルの内容:
  • apiVersion: skaffold/v1beta3
    kind: Config
    build:
      artifacts:
        - image: registry.kube.com/skaffold/cloud-boot     #  , push
          jibGradle: {}    #  jib , , docker, :docker、bazel、jibMaven、jibGradle
    
  • skaffold build命令
  • を実行する.
    chenleis-MacBook-Pro:core chenlei$ pwd
    /Users/chenlei/IdeaProjects/cloud-boot/core
    chenleis-MacBook-Pro:core chenlei$ skaffold build
    Starting build...
    Building [registry.kube.com/skaffold/cloud-boot]...
    Setting image creation time to current time; your image may not be reproducible.
    
    Containerizing application to registry.kube.com/skaffold/cloud-boot:32571c3a0984c909399a82de148b002c...
    Base image '192.168.101.88:5000/distroless/java' does not use a specific image digest - build may not be reproducible
    
    Container entrypoint set to [java, -Dfile.encoding=UTF-8, -cp, /app/resources:/app/classes:/app/libs/*, com.chenlei.boot.Application]
    
    Built and pushed image as registry.kube.com/skaffold/cloud-boot:32571c3a0984c909399a82de148b002c
    Executing tasks:
    [==============================] 100.0% complete
    
    
    BUILD SUCCESSFUL in 1s
    3 actionable tasks: 1 executed, 2 up-to-date
    WARN[0001] Using digest instead of git commit: Running [git rev-parse --short HEAD]: stdout , stderr: fatal: not a git repository (or any of the parent directories): .git
    , err: exit status 128: exit status 128 
    2019/01/31 13:33:26 existing blob: sha256:23a2c449a14a49f421bbbc339650e391bb237722ff1972c8761d26bb7932ec76
    2019/01/31 13:33:26 existing blob: sha256:269521def953f8e22145983d8496b281bc1ecc258c07b45ef253af7d79b98216
    2019/01/31 13:33:26 existing blob: sha256:2fd31c99b7a960c959aa54c84592526608e523884b14c9feda3570d379ccadb5
    2019/01/31 13:33:26 existing blob: sha256:d5b96a299f00c11666a7ee1504a693b36076c1bdac3355594cbca6d530826abe
    2019/01/31 13:33:26 existing blob: sha256:027c4c64f3fea95b3ee06f48ad0248e2f2b3448ed2acbf88ddbc725ab172bf0b
    2019/01/31 13:33:26 existing blob: sha256:3e010093287c245d72a774033b4cddd6451a820bfbb1948c97798e1838858dd2
    2019/01/31 13:33:26 existing blob: sha256:6c82fff81a84c0d8cda17fcaf21357459d3ffa25917fd1975437a17a6408b008
    2019/01/31 13:33:27 registry.kube.com/skaffold/cloud-boot:dirty-94f9919: digest: sha256:94f99190d23f22742b082fb4e93938321d29c2f4a15fcfb3f2c1c4ca32d05282 size: 1243
    Build complete in 1.675632469s
    Starting test...
    Test complete in 18.573µs
    registry.kube.com/skaffold/cloud-boot -> registry.kube.com/skaffold/cloud-boot:dirty-94f9919
    

    結果ミラーの名前はskaffold.yamlファイルはbuildではなく決定します.gradleファイル
    2.3.1.2、dockerで構築する
  • Dockerfileファイル内容
  • FROM 192.168.101.88:5000/dmcop2/java:8
    MAINTAINER [email protected]
    
    ADD ./src/main/resources/a.txt /
    ADD ./b.txt /
    
    CMD sleep infinity
    
  • Skaffold.yamlファイル内容
  • apiVersion: skaffold/v1beta3
    kind: Config
    build:
      artifacts:
        - image: registry.kube.com/skaffold/cloud-boot
      local:
        push: true       #  push 
    
  • skaffold build命令
  • を実行する.
    ミラーを作るには以上の2種類をご紹介しますが、GCBとKanikoは使ったことがありません.

    2.3.2、Using deployers


    2.3.2.1、kubectlを使用して配置する
  • kubectlを使用するには、kubernetes-cloud-bootなどの対応する配置記述ファイルを作成する必要がある.yml、ファイルの内容は以下の通りです:
  • kind: Deployment
    apiVersion: apps/v1
    metadata:
      labels:
        app: cloud-boot
      name: cloud-boot
    spec:
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: cloud-boot
      template:
        metadata:
          labels:
            app: cloud-boot
        spec:
          containers:
            - name: cloud-boot
              image: registry.kube.com/skaffold/cloud-boot:dirty-d940460  #  tag 
              imagePullPolicy: Always
              ports:
                - containerPort: 8080
                  protocol: TCP
                  name: tcp
    

    注意:tagが指定されていないため、skaffoldはデフォルトのtagを生成します.配置時に注意する必要があります.後でより便利な処理方法があります.
  • Skaffold.yamlファイル内容
  • apiVersion: skaffold/v1beta3
    kind: Config
    build:    # build deploy , 
      artifacts:
        - image: registry.kube.com/skaffold/cloud-boot
      local:
        push: true
    deploy:
      kubectl:
        manifests:
          - kubernetes-cloud-boot.yml
        flags:
          apply:
            - --force=true
            - --grace-period=0
    
  • は、skaffold devまたはskaffold runを実行する
  • である.
    Devモードでは、プロジェクトファイルを変更するとskaffoldが自動的に再パッケージされて配置され、runモードではskaffold delete削除前の配置を実行する必要があります.
    注意:
  • devモードでの再配置はkubectl apply -f ....の再実行と同様であり、podが再構築されるかどうかはkubernetes〜に依存し、以下に説明する効果は、あなたが望む〜
  • である可能性がある.
  • ローカルでは、kubectlコマンドを実行し、kubeconfig
  • を構成する必要があります.
    2.3.2.2、helmを使用して配置する
  • Skaffold.yamlファイル内容
  • apiVersion: skaffold/v1beta3
    kind: Config
    build:
      artifacts:
        - image: registry.kube.com/skaffold/cloud-boot
          jibGradle: {}
    deploy:
      helm:
        releases:
          - name: cloud-boot
            chartPath: chart
            setValues:
              image.repository: registry.kube.com/skaffold/cloud-boot
              image.tag: dirty-d940460
              image.pullPolicy: "Always"
    
  • は、skaffold devまたはskaffold runを実行する
  • である.
    注意:
  • ローカルではhelmコマンドを直接実行し、対応する構成
  • を行う必要があります.

    2.3.3、Using taggers


    前述したように、skaffoldはデフォルトでミラーのtagを自動的に生成します.次の内容では、tag生成ルールをカスタマイズする方法について説明します.
    2.3.3.1、gitCommitの使用
    デフォルトのtag生成ポリシーは、Git commit ID、対応するskaffoldの値をとる.yamlの内容は次のとおりです.
    apiVersion: skaffold/v1beta3
    kind: Config
    build:
      artifacts:
        - image: registry.kube.com/skaffold/cloud-boot
          jibGradle: {}
      tagPolicy:
        gitCommit: {}
    

    2.3.3.2、sha 256の使用
    apiVersion: skaffold/v1beta3
    kind: Config
    build:
      artifacts:
        - image: registry.kube.com/skaffold/cloud-boot
          jibGradle: {}
      tagPolicy:
        sha256: {}
    

    sha 256を使用する利点:生成されるたびにミラーのtagが異なるため、デプロイするたびにkubernetesはpod~を再構築します.
    2.3.3.3、使用環境変数
  • Skaffold.yamlファイル内容
  • apiVersion: skaffold/v1beta3
    kind: Config
    build:
      artifacts:
        - image: registry.kube.com/skaffold/cloud-boot
      tagPolicy:
        envTemplate:
          template: "{{ .IMAGE_NAME }}:{{ .IMAGE_TAG }}"
      local:
        push: false
    
  • 実行skaffold build
  • chenleis-MacBook-Pro:core chenlei$ export IMAGE_TAG=v1
    chenleis-MacBook-Pro:core chenlei$ skaffold build
    

    2.3.3.4、タイムスタンプの使用
    apiVersion: skaffold/v1beta3
    kind: Config
    build:
      artifacts:
        - image: registry.kube.com/skaffold/cloud-boot
      tagPolicy:
        dateTime:
          format: "2006-01-02"
          timezone: "UTC"
      local:
        push: false
    

    注意:formatの完全なフォーマットは2006-01-02_15-04-05.999_MSTです.

    2.3.4、Using file sync


    devモードでsyncを使用すると、一部のファイルが変更されたときに、直接コンテナにファイルをコピーすることができ、ミラーを作成するステップを省き、効率を提供します.これは静的ファイルにとって非常に有用です.
  • skaffold.ymlファイル内容
  • apiVersion: skaffold/v1beta3
    kind: Config
    build:
      artifacts:
        - image: registry.kube.com/skaffold/cloud-boot
          sync:
            '**/*.txt': /
      tagPolicy:
        sha256: {}
      local:
        push: false
    deploy:
      kubectl:
        manifests:
          - kubernetes-cloud-boot.yml
    

    devモードではsyncは効率を効果的に向上させることができるが、skaffoldは現在高速高発ノードであり、バグが非常に存在している.私が上記の練習を行ったところ、b.txtファイルのみが同期されていることが分かったが、a.txtファイルは同期できない~

    2.3.5、Using port forwarding



    2.3.6、Using profiles


    上記の内容は主にbuildとdeployの2つの部分を定義し、構築と導入プロセスを制御することができます.通常、実際の作業では、アプリケーションを異なる環境でパブリッシュおよびテストする必要があります.そのため、次のような複数の異なるprofileを定義できます.
    apiVersion: skaffold/v1beta3
    kind: Config
    profiles:
      - name: p1
        build:
          artifacts:
            - image: registry.kube.com/skaffold/cloud-boot
          tagPolicy:
            dateTime:
              format: "2006-01-02"
              timezone: "UTC"
          local:
            push: true
        deploy:
          kubectl:
            manifests:
              - kubernetes-cloud-boot.yml
      - name: p2
        build:
          artifacts:
            - image: registry.kube.com/skaffold/cloud-boot
              jibGradle: {}
          tagPolicy:
            sha256: {}
        deploy:
          helm:
            releases:
              - name: cloud-boot
                chartPath: chart
                setValueTemplates:
                  image.repository: "{{ .IMAGE_NAME }}"
                  image.tag: "{{ .DIGEST }}"
                  image.pullPolicy: "Always"
    
    skaffold devまたはskaffold runの実行時には、パラメータ-pまたは--profileにより指定する

    2.3.7、Using testers


    主にコンテナ内のファイルの構造が完全かどうかをテストします.たとえば、ファイルが存在するかどうかを検出します.

    2.3.8、Using templated fields


    前述の内容では、tagPolicyによって生成されるミラー名が一致しない場合、アプリケーションを導入するたびにミラー名を調整する必要があります.次のように、組み込みテンプレート変数を使用して実際の値を参照できます.
    apiVersion: skaffold/v1beta3
    kind: Config
    build:
      artifacts:
        - image: registry.kube.com/skaffold/cloud-boot
      tagPolicy:
        sha256: {}
    deploy:
      helm:
        releases:
          - name: cloud-boot
            chartPath: chart
            setValueTemplates:   #  setValueTemplates
              image.repository: "{{ .IMAGE_NAME }}"
              image.tag: "{{ .DIGEST }}"
              image.pullPolicy: "Always"
    
  • 現在組み込み変数を使用できるフィールドは、build.tagPolicy.envTemplate.templateおよびdeploy.helm.releases.setValueTemplates
  • のみです.
  • 現在内蔵されている変数は、IMAGE_NAMEDIGEST
  • である.

    3、注意事項

  • Jib+skaffoldを使用すると、結果としてミラーの名前がskaffoldによって決まる
  • .

    4、参考資料

  • https://skaffold.dev/docs/
  • https://github.com/GoogleContainerTools/skaffold