SLB/Cloud Disk/NAS/OSS連携

作成日:2020-04-13

Container Service for Kubernetes (ACK) と Alibaba Cloud プロダクトを連携する Part 1 (SLB, Cloud Disk, NAS, OSS)

本記事では、Container Service for Kubernetes (ACK) を使用して、Alibaba Cloud の各プロダクトとの連携方法についてご紹介します。

img

はじめに

クラウド環境でマネージドのKubernetesを利用する場合、そのクラウド環境のプロダクトとシームレスに連携が行える為、必要に応じてKubernetesから各プロダクトを利用するケースも多いのではないでしょうか。
Alibaba Cloud でも、Container Service for Kubernetes (ACK) から各プロダクトとの連携が可能になっています。
今回は、ロードバランサー(SLB)とストレージ(Cloud Disk, Object Storage Service, NAS)の連携についてご紹介したいと思います。
また、今回ご紹介する内容については、Alibaba Cloud の Container Service for Kubernetes (ACK) ドキュメントへも設定手順が記載されていますので、合わせてご覧頂けると良いかと思います。

※ 各設定については、コンソールからも設定可能となっていますが、今回はKubernetesのマニフェストを使用し設定したいと思います。

プロダクト連携

Server LoadBlancer (SLB)

まずは、ACKからAlibaba Cloud のSLB(ロードバランサー)を操作してみます。
実施する内容ですが、Serviceを定義し新規にSLBを起動させる方法と、事前に作成されている既存のSLBを利用する方法を実施します。

構成イメージ

今回はブラウザから動作を確認する為、事前にNginxのPodを作成しておき、そのPodに対してServiceを設定していきます。

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx
name: nginx
EOF

新規SLB作成

ACKからServiceを設定し、新規にSLBを利用するようにします。

Serviceへ「Type: LoadBlancer」を指定します。
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
labels:
run: nginx
name: nginx
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer
EOF

SLBが作成され、EXTERNAL-IPへSLBのパブリックIPが付与されます。

# kubectl get svc -l run=nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx LoadBalancer 172.21.4.33 47.245.8.247 80:30526/TCP 67s

ブラウザでEXTERNAL-IPへ接続すると、Nginxのトップページが表示されました。 img

既存SLB追加

次に作成済みのSLBをACKから利用する為、事前に以下のようにSLBは作成しておきます。

img

ACKから作成済みのSLBを利用するには、マニフェストのannotationsへSLBの各種設定を行います。
今回はannotationsへSLBのIDを指定し、既存設定の上書きを有効にする事で、作成したServiceの設定がSLBへ適応されます。
※ はじめに作成したServiceは削除してから実行しています。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-0iw0i70ijok17wfemjm4x" # SLBIDを指定します
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true" # 既存設定を上書きします
labels:
run: nginx
name: nginx
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer
EOF

Serviceには作成したSLBが設定され、リスナーや仮想サーバグループが設定されている事がコンソールからも確認できます。

# kubectl get svc -l run=nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx LoadBalancer 172.21.13.199 47.245.7.99 80:31824/TCP 56s

img

この他にも、annotationsへはSLBの各種設定を細かく設定する事が可能となっています。
詳しくは以下のドキュメントを参照頂ければと思います。

https://www.alibabacloud.com/help/doc-detail/86531.htm


ストレージ

続いて、ACKからAlibaba Cloud のストレージプロダクトを利用してみたいと思います。 ボリュームとして利用可能なプロダクトは、Cloud Disk, Object Storage Service (OSS), NASとなります。 また、ボリュームのプラグインとしてクラスタ作成時に「Flexvolume」か「CSI」が選択可能となっており、今回は「CSI」を使用しています。
今回実施する手順は、各ストレージに対するPersistent VolumesとPersistentVolumeClaimを設定し、最後にPodからボリュームをマウントしてみます。
※ 検証手順を簡略化する為、Cloud Disk, Object Storage Service (OSS), NASを1度に全てPodからマウントしています。

img

Cloud Disk

ではCloud Diskから設定します。
ボリュームとして利用するCloud Diskを事前に作成しておきます。 img

作成したCloud DiskのディスクIDとゾーンを指定し、Persistent VolumesとPersistentVolumeClaimを設定します。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: disk-pv
labels:
alicloud-pvname: static-disk-pv
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
csi:
driver: diskplugin.csi.alibabacloud.com
volumeHandle: d-6we0wdz6sdpzip9uyj0e # Cloud Disk ID を指定します
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: topology.diskplugin.csi.alibabacloud.com/zone
operator: In
values:
- ap-northeast-1b # アタッチ先のNodeのゾーンを指定します
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: disk-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
selector:
matchLabels:
alicloud-pvname: static-disk-pv
EOF

https://www.alibabacloud.com/help/doc-detail/127601.htm

NAS

次にNASを設定します。
事前にNASを作成しマウントポイントを追加しておきます。

img

NASへ追加したマウントポイント「2536074bee3-uav64.ap-northeast-1.nas.aliyuncs.com」を指定し、Persistent VolumesとPersistentVolumeClaimを設定します。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: nas-pv
labels:
alicloud-pvname: nas-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
csi:
driver: nasplugin.csi.alibabacloud.com
volumeHandle: nas-pv
volumeAttributes:
server: "2536074bee3-uav64.ap-northeast-1.nas.aliyuncs.com" # マウントポイントを指定します
path: "/csi"
vers: "3"
options: "noresvport,nolock"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nas-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
selector:
matchLabels:
alicloud-pvname: nas-pv
EOF

https://www.alibabacloud.com/help/doc-detail/134884.htm

Object Storage Service (OSS)

OSSも同様に事前にバケットを作成しておきます。
今回は「oss-volume」と言う名前でバケットを作成しました。

img

作成したバケット利用する為、AccessKey ID とAccessKey の設定が必要となります。
こちらは、KubernetesのSecretへ登録します。
※ AccessKey ID とAccessKeyの値はマスクしています。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: oss-secret
namespace: default
stringData:
akId: ***
akSecret: ***
EOF

次にPersistent Volumesの設定ですが、先ほど登録したSecret、作成したOSSのバケット、OSSのエンドポイントを指定します。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: oss-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: oss-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
csi:
driver: ossplugin.csi.alibabacloud.com
volumeHandle: data-id
nodePublishSecretRef:
name: oss-secret # AccessKeyIDとAccessKeyを設定したSecretを指定
namespace: default
volumeAttributes:
bucket: "oss-volume" #バケットを指定
url: "oss-ap-northeast-1-internal.aliyuncs.com" # OSSのエンドポイントを指定
otherOpts: "-o max_stat_cache_size=0 -o allow_other"
EOF

https://www.alibabacloud.com/help/doc-detail/134903.htm

ボリューム確認

作成したボリュームを確認してみます。各ストレージのボリュームが作成されています。

# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/disk-pv 20Gi RWO Retain Bound default/disk-pvc 3m56s
persistentvolume/nas-pv 5Gi RWX Retain Bound default/nas-pvc 3m35s
persistentvolume/oss-pv 5Gi RWX Retain Bound default/oss-pvc 3m21s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/disk-pvc Bound disk-pv 20Gi RWO 3m56s
persistentvolumeclaim/nas-pvc Bound nas-pv 5Gi RWX 3m35s
persistentvolumeclaim/oss-pvc Bound oss-pv 5Gi RWX 3m21s

先ほど作成した各ボリュームのPersistentVolumeClaim、マウント先を指定してPodを作成します。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
labels:
run: busybox
name: busybox
spec:
containers:
- image: busybox
name: busybox
args:
- /bin/sh
- -c
- sleep 3600
volumeMounts:
- name: disk-pvc
mountPath: /disk # Cloud Diskのマウント先
- name: nas-pvc
mountPath: /nas # NASのマウント先
- name: oss-pvc
mountPath: /oss # OSSのマウント先
volumes:
- name: disk-pvc
persistentVolumeClaim:
claimName: disk-pvc # CloudDisk PVC
- name: nas-pvc
persistentVolumeClaim:
claimName: nas-pvc # NAS PVC
- name: oss-pvc
persistentVolumeClaim:
claimName: oss-pvc # OSS PVC
EOF

起動したPodからマウントを確認します。
先ほど作成したCloud Disk, NAS, OSSがボリュームとしてマウント出来ている事が確認できました。

# kubectl exec -it busybox -- df -Th | egrep "disk|nas|oss"
ossfs fuse.ossfs 256.0T 0 256.0T 0% /oss
/dev/vdb ext4 19.6G 44.0M 19.5G 0% /disk
2536074bee3-qnd82.ap-northeast-1.nas.aliyuncs.com:/csi
nfs 10.0P 0 10.0P 0% /nas

まとめ

今回はACKからロードバランサー(SLB)と、Cloud Disk, NAS, OSSの連携を試してみました。
各実行手順については、リンク先のドキュメントへも記載されていますので、ぜひ合わせてご覧頂ければと思います。

次回はLog Service, RAM等の連携についてご紹介出来ればと思います。
最後までお読み頂き、ありがとうございました。

有馬 茂人
この記事を書いた人
有馬 茂人
Github Icon
2018年ソフトバンクへjoin。普段はIaC・コンテナ・Kubernetes等を触っているエンジニアです。
Close

Alibaba Cloudを始めてみましょう

ソフトバンクは、Alibaba Cloudのアカウント開設から、サービス展開までをお手伝いします。
Hatena