(O+P)ut

アウトプット



(O+P)ut

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

【Tekton/Kubernetes】コンテナからK8sに対してkubectlを打つTaskの例

スポンサーリンク

はじめに

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を操作してみました。ご参考になれば幸いです。