はじめに
CI/CDのOSSの一つであるTektonを活用して、Kubernetes上にPodをデプロイする。
デプロイはyamlファイルを使って、認証を必要としないコンテナレジストリからデプロイを行う。
環境
- Ubuntu20.04.1
- Kubernetes 1.25.5.
- CRI-O 1.25.2
- Tekton Pipeline 0.53.3
Kubernetesにデプロイ
カタログを活用する
カタログの一つであるkubernetes-actionsのtaskのインストールする。 kubernetes-actionsのversionは0.2を使用する。 カタログを活用することで、Tektonのtaskの利用が容易になる。
$ git clone https://github.com/tektoncd/catalog $ cd catalog/task/kubernetes-actions $ ls 0.1 0.2 $ kubectl apply -f 0.2/kubernetes-actions.yaml #確認 $ kubectl get task kubernetes-actions NAME AGE kubernetes-actions 18s
ServiceAccountへの権限付与
taskを実行するServiceAccountを作成する。そしてそのServiceAcountに与える権限をRole, RoleBindingを用いて作成する。
ServiceAccount, Role, RoleBindingの説明を以下に記す。
- ServiceAccount: KubernetesのPodがAPIサーバーと通信するためのアカウントです。Podが特定のServiceAccountを使用するように設定すると、そのPodはServiceAccountの認証情報を使用してAPIサーバーと通信する。
- Role: KubernetesのAPIリソースに対するアクセス権限を定義します。Roleは特定のNamespace内でのみ有効で、そのNamespace内のリソースに対する読み取り、書き込み、更新、削除などの操作を許可または拒否することができる。
- RoleBinding: RoleとServiceAccountを結びつける役割を果たします。RoleBindingはRoleのアクセス権限をServiceAccountに付与する。これにより、そのServiceAccountを使用するPodはRoleで定義された操作をAPIリソースに対して実行することができる。
$ vim my-tekton-pipeline-sa.yaml apiVersion: v1 kind: ServiceAccount metadata: name: my-tekton-pipeline #secrets: # - name: dockerhub-cred --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: my-tekton-pipeline-role rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - apiGroups: ["apps"] resources: ["deployments"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: my-tekton-pipeline-rolebinding subjects: - kind: ServiceAccount name: my-tekton-pipeline apiGroup: "" roleRef: kind: Role name: my-tekton-pipeline-role apiGroup: rbac.authorization.k8s.io # deploy $ kubectl apply -f my-tekton-pipeline-sa.yaml #確認 $ kubectl get sa,role,rolebinding NAME SECRETS AGE serviceaccount/default 0 72d serviceaccount/my-tekton-pipeline 0 12h NAME CREATED AT role.rbac.authorization.k8s.io/my-tekton-pipeline-role 2024-02-07T09:38:21Z NAME ROLE AGE rolebinding.rbac.authorization.k8s.io/my-tekton-pipeline-rolebinding Role/my-tekton-pipeline-role 12h
タスク作成と実行
パイプラインを作成する。
上記 を参照し、サンプルコードを活用して記載する。
$ vim kubernetes-actions-test2.yaml apiVersion: tekton.dev/v1beta1 kind: TaskRun metadata: name: kubectl-run spec: serviceAccountName: my-tekton-pipeline taskRef: name: kubernetes-actions params: - name: script value: | kubectl apply -f https://raw.githubusercontent.com/vinamra28/social-client/master/k8s/deployment.yaml ---------- kubectl get deployment #taskrunの実行 $ kubectl apply -f kubernetes-actions-test2.yaml #確認 $ kubectl get taskrun NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME kubectl-run Unknown Running 5s $ kubectl get po NAME READY STATUS RESTARTS AGE kubectl-run-pod 0/1 Completed 0 25s $ kubectl logs kubectl-run-pod Defaulted container "step-kubectl" out of: step-kubectl, prepare (init), place-scripts (init) deployment.apps/my-client-v2 unchanged /tekton/scripts/script-0-fw2mn: line 11: ----------: command not found NAME READY UP-TO-DATE AVAILABLE AGE my-client-v2 1/1 1 1 13h
taskrunのscript上で記載されているコマンド kubectl get deployment の内容がlogに残っていることが確認できた。