(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Tekton/Kubernetes】デプロイメントを作成する"deploy-application"を読み解く

スポンサーリンク

はじめに

Tektonのサンプルコードとして提供される以下のコードを実際に動かし、ログを見ることで内部の動きを調査しました。

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
  name: deploy-application
spec:
  inputs:
    resources:
      - name: git-source
        type: git
    params:
      - name: pathToContext
        description: The path to the build context, used by Kaniko - within the workspace
        default: .
      - name: pathToYamlFile
        description: The path to the yaml file to deploy within the git source
        default: deploy.yaml
      - name: imageUrl
        description: Url of image repository
        default: url
      - name: imageTag
        description: Tag of the images to be used.
        default: "latest"
  steps:
    - name: update-yaml
      image: alpine
      command: ["sed"]
      args:
        - "-i"
        - "-e"
        - "s;IMAGE;$(inputs.params.imageUrl):$(inputs.params.imageTag);g"
        - "$(inputs.resources.git-source.path)/$(inputs.params.pathToContext)/$(inputs.params.pathToYamlFile)"
    - name: deploy-app
      image: lachlanevenson/k8s-kubectl
      command: ["kubectl"]
      args:
        - "apply"
        - "-f"
        - "$(inputs.resources.git-source.path)/$(inputs.params.pathToContext)/$(inputs.params.pathToYamlFile)"
環境情報
$ kubectl get node
NAME            STATUS   ROLES    AGE   VERSION
...   Ready    <none>   xx   v1.20.8+IKS

入力情報を確認する

パラメータは下記でimageUrl/imageTagは明示的に指定する必要があり、それぞれdocker buildを行うパス、Dockerfile名、イメージパス、イメージタグが対応します。

name: pathToContext
default: .
name: pathToYamlFile
default: deploy.yaml
name: imageUrl
default: url
name: imageTag
description: Tag of the images to be used.
default: "latest"
name: pathToContext
default: .

またリソースとしてgit-sourceが指定されているので同名で用意する必要があり

$ kubectl get pipelineresource
NAME   AGE
git    23h

そのパイプラインリソースの中では以下を記載する必要があり、revisionにはツリー名、urlにはGithubのURLを指定します。

  Params:
name:   revision
name:   url

入力情報の与え方

imageURLとimageTagとpathToContextとpathToYamlFile、そしてGitのリソースの与え方はTaskをキックするPipelineRunに記述します。
YAMLを一部抜粋すると

apiVersion: tekton.dev/v1alpha1
kind: PipelineRun
..
  resources:
    - name: git-source
      resourceRef:
        name: git
  params:
    - name: pathToContext
      value: "src"
    - name: pathToYamlFile
      value: "deploy.yaml"
    - name: "imageUrl"
      value: "IMAGE_URL"
    - name: "imageTag"
      value: "IMAGE_TAG"

入力情報の使われ方

最初のコンテナがurlとrevision情報を元に「/workspace/git-source」というディレクトリにgit pullをして

$ kubectl logs application-pipeline-run-deploy-application-h62lh-pod-nzgx9 -c step-git-source-git-source-9zkbl
{"level":"info",..."msg":"Successfully initialized and updated submodules in path /workspace/git-source"}

その取得したyamlのパスを"$(inputs.resources.git-source.path)/$(inputs.params.pathToContext)/$(inputs.params.pathToYamlFile)"で指定して

sed -i -e "s;IMAGE;$(inputs.params.imageUrl):$(inputs.params.imageTag);g"

にてdeploy.yamlではIMAGEとなっている箇所を置換します。

そして最後にYAMLをkubectl applyします。

$ kubectl logs application-pipeline-run-deploy-application-h62lh-pod-nzgx9 -c step-deploy-app
service/app unchanged
deployment.apps/app unchanged

尚、同コマンドは「system:serviceaccount:default:service-account」の権限で実行されることは別のkubectlコマンドで表示されるエラーから確認できます。

$ kubectl logs application-pipeline-run-deploy-application-7m56d-pod-dld5c -c step-deploy-app
Error from server (Forbidden): nodes is forbidden: User "system:serviceaccount:default:service-account" cannot list resource "nodes" in API group "" at the cluster scope

終わりに

以下記事の後続Taskについて調査しました。

以上、ご参考になれば幸いです。