はじめに
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について調査しました。
以上、ご参考になれば幸いです。