はじめに
Tektonを利用したCI/CDの中でDockerDesktopのKubernetesクラスターにkubectlコマンドを打つTaskを生成しました。
以下記事のkubectlバージョンとなりますが、動くことを優先して権限分離を考慮していないので参考程度に利用ください。
環境情報
- Windows 10
- Cygwin
- DockerDesktop 2.4 (DE 19.03, K8s 1.18)
- pipeline.tekton.dev/release: "v0.17.0"
方針
コンテナの中からkubectlコマンドを打つためにlachlanevenson/k8s-kubectl
イメージを利用します。
イメージ内を見ると以下のように記載があるので
"WorkingDir": "/root",
"Entrypoint": [
"kubectl"
],
kubectlの引数を与えて実行するも以下のエラーとなります、
$ docker run -it lachlanevenson/k8s-kubectl get pod The connection to the server localhost:8080 was refused - did you specify the right host or port?
理由はクラスター情報をコンテナ内から利用できないからです。
対応として、今回はシンプルに.kube/configをそのまま利用するべくコンフィグマップを作成しました。
$ kubectl create configmap mykubeconfig --from-file=C:\\cygwin64\\tmp\\share\\config configmap/mykubeconfig created
$ kubectl get cm NAME DATA AGE mykubeconfig 1 xs
TaskのYAML
apiVersion: tekton.dev/v1alpha1 kind: Task metadata: name: kubectl-test spec: steps: - name: kubectl-test image: lachlanevenson/k8s-kubectl args: - "get" - "ns" volumeMounts: - name: config mountpath: ~/.kube/ volumes: - name: config configMap: name: mykubeconfig
テストとしてnamespaceを確認するコマンドとしています。
Taskrunの実行
Taskを展開した状態で
$ kubectl apply -f kubectl-test.yaml task.tekton.dev/kubectl-test created
以下のYAMLでTaskrunを実行すれば
apiVersion: tekton.dev/v1alpha1 kind: TaskRun metadata: name: taskrun-kubectl-test spec: taskRef: name: kubectl-test
以下のTaskが走り
$ kubectl create -f taskrun-kubectl-test.yaml taskrun.tekton.dev/taskrun-kubectl-test created
$ kubectl get taskrun NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME taskrun-kubectl-test True Succeeded xs xs
起動後のPodを見ると
$ kubectl logs taskrun-kubectl-test-pod-m8g4s NAME STATUS AGE default Active 2d19h kube-node-lease Active 2d19h kube-public Active 2d19h kube-system Active 2d19h tekton-pipelines Active 39h
ホスト上と同じクラスターに接続できています。
終わりに
Tektonの公式ドキュメントではパイプラインリソースを利用してクラスター情報を管理していますが、ローカルで行うハンズオンとしてTaskでKubernetesを操作してみました。ご参考になれば幸いです。