Tektonを活用して、Kubernetes上にPodをデプロイ

はじめに

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: KubernetesAPIリソースに対するアクセス権限を定義します。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

タスク作成と実行

パイプラインを作成する。

github.com

上記 を参照し、サンプルコードを活用して記載する。

$ 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に残っていることが確認できた。

参考

blog.mosuke.tech