オープンネットワークからNASにアクセス

はじめに

Synology社のNASを構築し、ローカルネットワーク外のオープンネットワークからNASにアクセスすることができるように設定を行う。

環境

  • NAS:Synology DiskStation DS220j
  • Windows11

構築

事前準備

NASにディスクを差し込み、LANを繋げる。 そして電源を入れる。

OSのインストール

https://finds.synology.com/# にアクセスする。ローカルネットワーク内のNASを自動的に検索、検出する、

指示に従い、OSをインストールする。

QuickConnect機能(インターネット上のどこからでもNASにアクセスできるサービス)を使用するため、アカウントを作成する。

ストレージプール作成

続いて、NASにデータを保存できるようにストレージプールを作成する。 基本的には推奨されるRAID(Basic), フォーマットタイプ(Btrfs)とした。

作成後、以下の画面を確認した。

QuickConnect機能(インターネット上のどこからでもNASにアクセスできるサービス)の設定

[コントローラパネル] - [外部アクセス] の順に選択する。 [QuickConnectを有効にする]にチェックが入っていることを確認する。

アカウント作成

QuickConnect機能でNASにアクセスする一般アカウントを作成する。

https://global.synologydownload.com/download/Document/Software/UserGuide/Os/DSM/7.0/jpn/NAS_Beginners_Guide_7.0_jpn.pdf 3.4章を参考に実施する。

今回は省略する。

Synology Drive Serverのインストール

https://global.synologydownload.com/download/Document/Software/UserGuide/Os/DSM/7.0/jpn/NAS_Beginners_Guide_7.0_jpn.pdf 4.2 で紹介されているSynology Drive ServerをNASにインストールする。

Synology Drive のインストール

www.synology.com PCにSynology Drive (クライアントアプリ)をインストールし、設定を行う。

おわりに

これで、オープンネットワークからNASにアクセスできる環境を構築できた。 最初、ネットワークドライブとしてマウントできると思ったができなかったため焦った。

参考

Synology NAS 初心者ガイドのマニュアル

https://global.synologydownload.com/download/Document/Software/UserGuide/Os/DSM/7.0/jpn/NAS_Beginners_Guide_7.0_jpn.pdf

www.synology.com

WSL2にKVM/QEMUを使った仮想環境構築

はじめに

WindowsVirtualboxを使って仮想環境を作成していたが、手間だったので、KVM/QEMUで簡易化ができるのではにないかと思い、実施する。

環境

  • Windows10(ホストOS)
  • WSL2
  • Ubuntu 22.04.3 LTS(WSL2上)
  • Ubuntu 22.04.3 LTS(KVM上)

構築

KVMのインストール

KVMをインストールする

$ sudo apt install -y libvirt-clients qemu-utils qemu-kvm libvirt-daemon libvirt-daemon-system

仮想環境が使用するイメージを作成

次に、cloud-initを使ってKVMで上で仮想環境を構築したいので、cloud-initで使用するcloudimgをダウンロードする。 https://cloud-images.ubuntu.com/releases/22.04/release/からcloudimgをダウンロードする。 保存先は/var/lib/libvirt/imagesとした。

#rootでログインして、ベースイメージのあるディレクトリへ移動
$ sudo -i
# cd /var/lib/libvirt/images

# curl -O https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-amd64.img
# ls
ubuntu-22.04-server-cloudimg-amd64.img

次に仮想環境が使用するイメージを作成する。 ディスク容量は30Gとした。

# VMNAME=ubuntu22-vm1
## qemu-imgで扱えるように拡張子の変換
# qemu-img create -F qcow2 -b ubuntu-22.04-server-cloudimg-amd64.img -f qcow2 $VMNAME.qcow2 30G
Formatting 'id-vm1.qcow2', fmt=qcow2 size=53687091200 backing_file=ubuntu-20.04.1-server-cloudimg-amd64.img backing_fmt=qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16

作成された .qcow2 は ubuntu-*.qcow2 をベースとし、ベースからの差分が書き込まれていく。 ベースイメージ .img は絶対に移動/削除しないこと。

イメージのメタデータを確認するには qemu-img info を使う。

# qemu-img info $VMNAME.qcow2
image: ubuntu22-vm1.qcow2
file format: qcow2
virtual size: 30 GiB (32212254720 bytes)
disk size: 196 KiB
cluster_size: 65536
backing file: ubuntu-22.04-server-cloudimg-amd64.img
backing file format: qcow2
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    extended l2: false

作成したら root から抜けて一般ユーザ(ubuntu)に戻る。

# exit
logout
$ 

cloud-init用のuser-data/meta-dataの準備

cloud-init用のuser-data/meta-dataの準備する。 このイメージファイルにはcloud-initがインストールされており、外部から与えられたmeta-dataおよびuser-dataの設定に基いて、起動時にVMの各種初期化(ログインパスワードの設定、NICの設定、ファイルシステム設定、公開鍵の登録…など)を行うことができる。

# 作業用ディレクトリ作成
$ cd
$ mkdir -p cloud-init
$ cd cloud-init/

VMNAMEの変数をVM名に設定し、user-data/meta-dataを作成する下記コマンドを実行する。 VMNAMEの名前でディレクトリが作成され、cidata-(VM名).iso というISOイメージができる。 パスワードはubuntuとする。

#必要なライブラリをインストール
$ sudo apt install -y genisoimage

$ (
VMNAME=ubuntu22-vm1
mkdir -p $VMNAME
pushd $VMNAME
cat > user-data <<-EOS
#cloud-config
password: ubuntu
chpasswd: {expire: False}
ssh_pwauth: True
EOS
cat > meta-data <<-EOS
instance-id: $VMNAME
local-hostname: $VMNAME
EOS
genisoimage -output ../cidata-${VMNAME}.iso -volid cidata -joliet -rock user-data meta-data
popd
)

#出力
~/cloud-init/ubuntu22-vm1 ~/cloud-init
I: -input-charset not specified, using utf-8 (detected in locale settings)
Total translation table size: 0
Total rockridge attributes bytes: 331
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
183 extents written (0 MB)
~/cloud-init

VMの作成と起動

以下のVMを作成するためのシェルスクリプトを作成する。

$ cat > create-ubuntu22-vm1.sh << "EOF"
#!/bin/bash

# VM name
VMNAME=ubuntu22-vm1
# # of vCPUs assigned to the VM
VCPUS=2
# RAM size assigned to the VM
RAMSIZE=4  # Unit: GB
# VM image file name
IMAGE_FILE=/var/lib/libvirt/images/${VMNAME}.qcow2
CIDATA_FILE=$PWD/cidata-${VMNAME}.iso

if [ ! -r $CIDATA_FILE ]; then
    echo "error: $CIDATA_FILE not found"
    exit 1
fi
if [ ! -r $IMAGE_FILE ]; then
    echo "error: $IMAGE_FILE not found"
    exit 2
fi
sudo virt-install \
    --name $VMNAME \
    --ram $(($RAMSIZE * 1024)) \
    --vcpus $VCPUS \
    --arch x86_64 \
    --os-type linux \
    --os-variant ubuntu22.04 \
    --virt-type qemu\
    --file $IMAGE_FILE \
    --cdrom $CIDATA_FILE \
    --boot hd \
    --network network:default \
    --graphics none \
    --serial pty \
    --console pty \
    --autostart --noreboot
EOF

vCPUとメモリの設定は必要に応じて変える。

libvirt-qemuユーザーが/home/ubuntuディレクトリにアクセスできるようにするためには、以下のコマンドを実行する。

$ sudo setfacl -m u:libvirt-qemu:x /home/ubuntu

次に、シェルスクリプトの実行する。このシェルスクリプトではvirt-installコマンドを使用しているのでそれをインストールしてから、シェルスクリプトを実行する。

#ライブラリをインストール
$ sudo apt install -y virt-manager

#シェルスクリプト実行
$ bash ./create-ubuntu22-vm1.sh

(数十分後)
ubuntu22-vm1 login: ubuntu ←作成したIDを入力
Password: ←user-dataで指定したpasswordを入力

ubuntu@ubuntu22-vm1:~$ ←WSL2上の仮想環境にログインできた。

念のために、WSL2上から仮想環境を確認する。

$ virsh list
 Id   Name           State
------------------------------
 6    ubuntu22-vm1   running

無事に動作していそうである。

参考

hiro20180901.hatenablog.com

トラブルシューティングメモ

#シェルスクリプト実行
$ bash ./create-ubuntu22-vm1.sh

WARNING  --os-type is deprecated and does nothing. Please stop using it.
ERROR    Host does not support domain type kvm for virtualization type 'hvm' with architecture 'x86_64'

シェルスクリプト時、上記のエラーを確認した。 hiro20180901.hatenablog.com

上記 を参考に、WSL2 で Nested VM が有効かどうか確認する。

$ ls -l /dev/kvm*
crw-rw-r-- 1 root kvm 10, 232 Feb 26 07:33 /dev/kvm
$ egrep -c '(vmx|svm)' /proc/cpuinfo
0
$ kvm-ok
INFO: Your CPU does not support KVM extensions
INFO: For more detailed results, you should run this as root
HINT:   sudo /usr/sbin/kvm-ok

CPUがKVMをサポートしていないようだ。

現在のPCで使用しているCPUが 11th Gen Intel(R) Core(TM) i5-1145G7 @ 2.60GHz 2.61 GHz である。Intel CPUの場合、Intel® Virtualization Technology (VT-x)の機能があると、そのCPUが仮想化技術をサポートしているようである。

https://www.intel.co.jp/content/www/jp/ja/support/articles/000005486/processors.html を参考に、自分のCPUにIntel® Virtualization Technology (VT-x)があるかどうかをhttps://ark.intel.com/content/www/jp/ja/ark/products/208081/intel-core-i5-1145g7e-processor-8m-cache-up-to-4-10-ghz.html から確認したがサポートしているようだ。 そのことから、WSL2上ではkvm-okコマンドが正常に動作していないようである。

参考

hiro20180901.hatenablog.com

WSL2でWindowsのフォルダに対してシンボリックリンク作成

はじめに

WSL2でWindowsのフォルダにアクセスすることに時間がかかるので、よくアクセスするフォルダにシンボリックリンクを作成して、時間短縮を行う。

環境

  • Windows10(ホストOS)
  • WSL2
  • Ubuntu 22.04.3 LTS

シンボリックリンク作成

今回、DesktopとCドライブのシンボリックリンクを作成する。

$ cd ~
$ USERNAME=$(cmd.exe /c echo %USERNAME% | tr -d '\r')
$ ln -s /mnt/c/Users/$USERNAME/Desktop/ desktop
$ ln -s /mnt/c/ c_drive
$ ls 
c_drive  cloud-init  desktop

GlobalProtectを使用時、WSL2のUbuntuからオープンネットワークにアクセスする方法

はじめに

GlobalProtect を使ってWSL2のUbuntuからオープンネットワークにアクセスが失敗した。その解決方法を記載する、

環境

  • Windows10(ホストOS)
  • WSL2
  • Ubuntu 22.04.3 LTS

設定

オープンネットワークに接続できない理由として、以下が上げられる。

  • ホスト側のルーティングメトリックが不適切になっていることにより、WSLがオープンネットワークに接続できない
  • VPN用にIPアドレスを指定しないとDNS解決ができない

この解決する設定について後述する。

DNSサーバのIPアドレスの確認

コマンドプロンプトを開く。

次に、PANGP Virtual Ethernet Adapter Secureという、GlobalProtect VPNクライアントがシステムにインストールする仮想ネットワークアダプターを確認する。

>ipconfig /all
イーサネット アダプター イーサネット 2:

   接続固有の DNS サフィックス . . . . .:
   説明. . . . . . . . . . . . . . . . .: PANGP Virtual Ethernet Adapter Secure
(中略)
   DNS サーバー. . . . . . . . . . . . .: X.X.X.X

メトリックの設定

次に、メトリックを変更する。 PowerShellを管理者権限で実行する。 aquasoftware.net からメトリックを設定するソースコードを流用して、Powershell上で実行する。

$targetIfName = 'PANGP Virtual Ethernet Adapter';
# define function
function Get-NetworkAddress {
    param([Parameter(Mandatory, ValueFromPipelineByPropertyName)][string]$IPAddress, [Parameter(Mandatory, ValueFromPipelineByPropertyName)][int]$PrefixLength);
    process {
        $bitNwAddr = [ipaddress]::Parse($IPAddress).Address -band [uint64][BitConverter]::ToUInt32([System.Linq.Enumerable]::Reverse([BitConverter]::GetBytes([uint32](0xFFFFFFFFL -shl (32 - $PrefixLength) -band 0xFFFFFFFFL))), 0);
        [pscustomobject]@{
            Addr = $IPAddress;
            Prfx = $PrefixLength;
            NwAddr = [ipaddress]::new($bitNwAddr).IPAddressToString + '/' + $PrefixLength;
        };
    }
}
# extend route metric
$targetAddresses = Get-NetAdapter -IncludeHidden | Where-Object InterfaceDescription -Match 'Hyper-V Virtual Ethernet Adapter' | Get-NetIPAddress -AddressFamily IPv4 | Get-NetworkAddress;
$targetIfs = Get-NetAdapter -IncludeHidden | Where-Object InterfaceDescription -Match $targetIfName;
$targetIfs | Set-NetIPInterface -InterfaceMetric 2;
$targetIfs | Get-NetRoute -AddressFamily IPv4 | Select-Object -PipelineVariable rt | Where-Object { $targetAddresses | Where-Object { $_.NwAddr -eq (Get-NetworkAddress $rt.DestinationPrefix.Split('/')[0] $_.Prfx).NwAddr } } | Set-NetRoute -RouteMetric 6000;

GlobalProtect 以外の場合は、 上記コード一行目の 'PANGP Virtual Ethernet Adapter'のインターフェス名を適宜に変更する。

設定された結果を確認する。

> route print

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
       X.X.X.X  255.255.255.255            リンク上      10.8.206.178      2
     172.19.192.0    255.255.240.0            リンク上      10.8.206.178   6002
   172.19.207.255  255.255.255.255            リンク上      10.8.206.178   6002

nameserverの設定

WSL上でnameserverにGlobalProtectのDNSIPアドレスを設定する。

$ sudo vim /etc/resolv.conf

nameserver X.X.X.X

これで、オープンネットワークに接続される。

試しに、apt updateコマンドを実行し、接続されることを確認した。

$ sudo apt update
Hit:1 http://security.ubuntu.com/ubuntu jammy-security InRelease
Hit:2 http://archive.ubuntu.com/ubuntu jammy InRelease
Hit:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease
(省略)

参考

aquasoftware.net

Tektonを使用してクローン、ビルド、プッシュ

はじめに

CI/CDのTektonを使用して、GitHubからDockerfileを含むレポジトリをクローンし、ビルドしてDockerhubにプッシュする。

環境

  • Windows11(ホストOS)
  • Ubuntu22.04.3(ゲストOS、Virtualbox上に構築)
  • k3s v1.28.6+k3s2
  • CRI-O v1.26.0-rc.0-k3s1

必要なKubernetesリソースの作成

Secret, ServiceAccount作成

Dockerhubに試しにプッシュする。 DockerhubへアクセスができるようにSecret, ServiceAccountを作成する。

アクセストークンを取得

こちらを参考にアクセストークンを取得する。

matsuand.github.io

Secret, ServiceAccount作成

次にこのアクセストークンを使ってSecretを作成する。 username、取得したアクセストークンは適切に設定する。

#ログイン
YOUR_DOCKERHUB_USERNAME=<username>
YOUR_DOCKERHUB_ACCESS_TOKEN=<取得したアクセストークン>
REGISTRY=registry-1.docker.io
$ buildah login -u $YOUR_DOCKERHUB_USERNAME -p $YOUR_DOCKERHUB_ACCESS_TOKEN $REGISTRY
Login Succeeded!

https://github.com/containers/buildah/blob/540a73296f945aacbfaed40fa98e2fe86c7e52ac/docs/buildah-login.1.md?plain=1#L15 を確認すると、defaultでは、/run/user/$UID/containers/auth.jsonに認証情報が保持される。 これを使って、KubernetseのSecretを作成する。

$ AUTH_PATH=/run/user/$UID/containers/auth.json
$ kubectl create secret generic dockerhub-cred \
    --from-file=.dockerconfigjson=$AUTH_PATH \
    --type=kubernetes.io/dockerconfigjson
secret/dockerhub-cred created

#確認
$ kubectl get secret
NAME             TYPE                             DATA   AGE
dockerhub-cred   kubernetes.io/dockerconfigjson   1      7m34s

$ kubectl describe secret dockerhub-cred
Name:         dockerhub-cred
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  kubernetes.io/dockerconfigjson

Data
====
.dockerconfigjson:  124 bytes

次にこれに紐づくServiceAccountを設定する。

$ cat > sa.yaml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-tekton-pipeline
secrets:
  - name: dockerhub-cred
EOF

#deploy
$ kubectl apply -f sa.yaml
serviceaccount/my-tekton-pipeline created

#確認
$ kubectl get sa
NAME                 SECRETS   AGE
my-tekton-pipeline   1         9s

task, pipeline, pipelinerunの作成

github.com

こちらのTektonのcatalogのgit-clone、buildahを使用する。

#deploy
$ git clone https://github.com/tektoncd/catalog.git
$ kubectl apply -f catalog/task/git-clone/0.9/git-clone.yaml
$ kubectl apply -f catalog/task/buildah/0.7/buildah.yaml 

#確認
$ kubectl get task
NAME          AGE
git-clone     5d11h
buildah       105m

次にpipelineとpipelinerunを作成する。

$ cat build-image-pipeline.yaml << EOF
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: build-image-pipeline
spec:
  workspaces: 
    - name: shared-workspace
  params:
    - name: git-url
      type: string
    - name: git-revision
      type: string
      default: "master"
    - name: image
      type: string
  tasks:
    - name: fetch-repository
      taskRef:
        name: git-clone
      workspaces:
        - name: output
          workspace: shared-workspace
      params:
        - name: url
          value: $(params.git-url)
        - name: deleteExisting
          value: "true"
        - name: revision
          value: $(params.git-revision)
    - name: build-push-image
      taskRef:
        name: buildah
      params:
        - name: IMAGE
          value: $(params.image)
        - name: DOCKERFILE
          value: "Dockerfile"
        - name: CONTEXT
          value: "$(workspaces.source.path)"
      workspaces:
        - name: source
          workspace: shared-workspace
      runAfter:
        - fetch-repository
EOF

$ cat > build-image-pipeline-run.yaml << EOF
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  name: build-image-pipeline-run
spec:
  pipelineRef:
    name: build-image-pipeline
  params: 
    - name: git-url
      value: https://github.com/ncskier/myapp
    - name: image
      value: mosuke5/tekton-practice:from-pipeline
  serviceAccountName: my-tekton-pipeline
  workspaces: 
    - name: shared-workspace
      volumeClaimTemplate:
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 1Gi
EOF

pipelinerunの実行

pipelineruを実行し、動作を確認する。

#pipelineruの実行
$ kubectl apply -f build-image-pipeline-run.yaml

#確認
$ kubectl get pipelinerun
NAME                       SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
clone-read                 True        Succeeded   5d11h       5d11h
build-image-pipeline-run   True        Succeeded   50s         19s

pipelinerunの実行が成功している。

次に、プッシュ先のDockerhubのレジストリを確認する。

hub.docker.com

こちらにアクセスし、作成したイメージがプッシュされていることを確認した。

参考

blog.mosuke.tech

buildahでビルドしたイメージをcri-oのローカルレジストリに追加

はじめに

buildahでビルドしたイメージをcri-oのローカルレジストリに追加、参照できるようにするためにハマったので記載する。

問題

次のように作成したDockerfileをcri-oから参照しようとすると確認ができなかった。

$ cat  >> Dockerfile < EOF
FROM 'docker.io/nginx:latest'
RUN apt-get update && apt-get install -y iputils-ping
CMD ["nginx", "-g", "daemon off;"]
EOF

$ buildah bud -t  test/nginx -f Dockerfile
$ buildah images|grep nginx
buildah bud -t test/nginx -f ./Dockerfile
buildah images
localhost/test/nginx                                                                 latest                         7111de1b2dd9   18 seconds ago   213 MB

$ sudo crictl images|grep nginx
(表示されない)

原因、理由

cri-oがデーモンで動作していることに対し、buildahはデーモンで動作していない。 また、buildahはユーザごとに異なるローカルレジストリを持つ。

  • ルートユーザーの場合:/var/lib/containers/storage
  • 非ルートユーザーの場合:$HOME/.local/share/containers/storage

今回、cri-oとルートユーザのローカルレジストリが共通であったため、非ルートユーザでビルドしたイメージをcri-oから確認ができなかった。 そのため、sudoコマンドを使用してビルドする。

$ sudo buildah bud -t  test/nginx -f Dockerfile

#確認
$ sudo buildah images|grep nginx
localhost/test/nginx                                                                 latest                         7111de1b2dd9   18 seconds ago   213 MB
$ sudo crictl images|grep nginx
localhost/test/nginx                                                                 latest                         7111de1b2dd91       213MB

無事に、cri-oからビルドしたイメージを確認するができた。

参考

www.redhat.com

Tektonを使ってGitHubのprivateレポジトリからクローン

はじめに

TektonのCatalogを使ってGitHubのprivateレポジトリからクローンする。

環境

  • Ubuntu20.04.1
  • Kubernetes 1.25.5.
  • CRI-O 1.25.2
  • Tekton Pipeline 0.53.3

前提条件

  • ローカルマシンにSSH鍵を保持すること
  • GitHubSSHの公開鍵を登録してあること

構築とクローン

カタログを活用する

カタログの一つであるgit-cloneのインストールする。 カタログを活用することで、Tektonのtaskの利用が容易になる。 今回はversionの0.9を使用する。

$ git clone https://github.com/tektoncd/catalog
$ cd catalog/task/git-clone
$ ls
0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9
$ kubectl apply -f 0.9/git-clone.yaml
$ kubectl get task git-clone
NAME                 AGE
git-clone   23h

Secretの作成

github のプライベートリポジトリからCloneするには認証情報を取得する必要があるので、そのSecretと対応するServiceAccountを事前に作成する。

Secret作成に必要な値を取得する。

SecretとServiceAccountを作成する。

#private keyのパスを指定
$ SSH_PRIVATEKEY_PATH=~/.ssh/id_ed25519

#tmpファイル作成
$ ssh-keyscan github.com 2&>/dev/null > tmp.txt

$ cat > secret_sa.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: git-credentials
  annotations:
    tekton.dev/git-0: github.com
type: kubernetes.io/ssh-auth
data:
  ssh-privatekey: $(cat $SSH_PRIVATEKEY_PATH | base64 -w 0) # ... base64-encoded private key ...
  known_hosts: $(cat tmp.txt |base64 -w 0) # ... base64-encoded known_hosts file …
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tekton-admin
secrets:
  - name: git-credentials
EOF

#tmpファイル削除
$ rm tmp.txt

#作成
$ kubectl apply -f secret_sa.yaml

#確認
$ kubectl get secret,sa
NAME                    TYPE                     DATA   AGE
secret/ssh-key          kubernetes.io/ssh-auth   2      5s

NAME                                SECRETS   AGE
serviceaccount/tekton-admin         1         5s

PVの作成

PVCの動的プロビジョニングをサポートしていないため、手動で作成する。

$ cat > pv.yaml << EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: example2
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /home/ubuntu/my-pv
EOF

$ kubectl apply -f pv.yaml

プライベートレポジトリのクローン

task作成

$ cat  > task-clone-read.yaml << "EOF"
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: show-readme
spec:
  description: Read and display README file.
  workspaces:
  - name: source
  steps:
  - name: read
    image: alpine:latest
    script: | 
      #!/usr/bin/env sh
      cat $(workspaces.source.path)/README.md
EOF

pipeline作成

$ cat > pipline-clone-read.yaml << "EOF"
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: clone-read
spec:
  description: | 
    This pipeline clones a git repo, then echoes the README file to the stout.
  params:
  - name: repo-url
    type: string
    description: The git repo URL to clone from.
  workspaces:
  - name: shared-data
    description: | 
      This workspace contains the cloned repo files, so they can be read by the
      next task.
  - name: git-credentials
    description: My ssh credentials
  tasks:
  - name: fetch-source
    taskRef:
      name: git-clone
    workspaces:
    - name: output
      workspace: shared-data
    - name: ssh-directory
      workspace: git-credentials
    params:
    - name: url
      value: $(params.repo-url)
  - name: show-readme
    runAfter: ["fetch-source"]
    taskRef:
      name: show-readme
    workspaces:
    - name: source
      workspace: shared-data
EOF

pipelinerun作成

REPO_URLには、GitHubのURLを記載する。 今回は例として、公開レポジトリのhttps://github.com/tektoncd/catalog を選択した場合を記載する。

$ REPO_URL=git@github.com:tektoncd/catalog.git
$ cat > piplinerun-clone-read.yaml << EOF
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  name: clone-read-run
spec:
  serviceAccountName: tekton-admin
  pipelineRef:
    name: clone-read
  podTemplate:
    securityContext:
      fsGroup: 65532
  workspaces:
  - name: shared-data
    volumeClaimTemplate:
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
  - name: git-credentials
    secret:
      secretName: git-credentials
  params:
  - name: repo-url
    value: $REPO_URL
EOF

デプロイ

$ kubectl apply -f task-clone-read.yaml
$ kubectl apply -f pipline-clone-read.yaml
$ kubectl apply -f piplinerun-clone-read.yaml

デプロイした内容を確認する

$ kubectl get taskrun,pv,pvc,pod
NAME                                             SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
taskrun.tekton.dev/clone-read-run-fetch-source   True        Succeeded   13s         7s
taskrun.tekton.dev/clone-read-run-show-readme    Unknown     Running     7s

NAME                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS   REASON   AGE
persistentvolume/example2   10Gi       RWO            Retain           Bound    default/pvc-b8db0b2018                           14s

NAME                                   STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/pvc-b8db0b2018   Bound    example2   10Gi       RWO                           13s

NAME                                      READY   STATUS      RESTARTS      AGE
pod/affinity-assistant-615320202e-0       1/1     Running     0             13s
pod/clone-read-run-fetch-source-pod       0/1     Completed   0             13s
pod/clone-read-run-show-readme-pod        1/1     Running     0             7s

$ kubectl logs pod/clone-read-run-show-readme-pod
# Tekton Catalog

**If you want `v1alpha1` resources, you need to go to the
[`v1alpha1`](https://github.com/tektoncd/catalog/tree/v1alpha1)
(省略)

クローンできていることを確認できた

参考

blog.mosuke.tech