Container Service for Kubernetes (ACK) と Alibaba Cloud プロダクトを連携する Part 1 (SLB, Cloud Disk, NAS, OSS)
本記事では、Container Service for Kubernetes (ACK) を使用して、Alibaba Cloud の各プロダクトとの連携方法についてご紹介します。
はじめに
クラウド環境でマネージドのKubernetesを利用する場合、そのクラウド環境のプロダクトとシームレスに連携が行える為、必要に応じてKubernetesから各プロダクトを利用するケースも多いのではないでしょうか。
Alibaba Cloud でも、Container Service for Kubernetes (ACK) から各プロダクトとの連携が可能になっています。
今回は、ロードバランサー(SLB)とストレージ(Cloud Disk, Object Storage Service, NAS)の連携についてご紹介したいと思います。
また、今回ご紹介する内容については、Alibaba Cloud の Container Service for Kubernetes (ACK) ドキュメントへも設定手順が記載されていますので、合わせてご覧頂けると良いかと思います。
プロダクト連携
Server LoadBlancer (SLB)
まずは、ACKからAlibaba Cloud のSLB(ロードバランサー)を操作してみます。
実施する内容ですが、Serviceを定義し新規にSLBを起動させる方法と、事前に作成されている既存のSLBを利用する方法を実施します。
今回はブラウザから動作を確認する為、事前にNginxのPodを作成しておき、そのPodに対してServiceを設定していきます。
cat <<EOF | kubectl apply -f -apiVersion: apps/v1kind: Deploymentmetadata:labels:run: nginxname: nginxspec:replicas: 1selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:containers:- image: nginxname: nginxEOF
新規SLB作成
ACKからServiceを設定し、新規にSLBを利用するようにします。
Serviceへ「Type: LoadBlancer」を指定します。cat <<EOF | kubectl apply -f -apiVersion: v1kind: Servicemetadata:labels:run: nginxname: nginxspec:ports:- port: 80protocol: TCPtargetPort: 80selector:run: nginxtype: LoadBalancerEOF
SLBが作成され、EXTERNAL-IPへSLBのパブリックIPが付与されます。
# kubectl get svc -l run=nginxNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx LoadBalancer 172.21.4.33 47.245.8.247 80:30526/TCP 67s
ブラウザでEXTERNAL-IPへ接続すると、Nginxのトップページが表示されました。
既存SLB追加
次に作成済みのSLBをACKから利用する為、事前に以下のようにSLBは作成しておきます。
ACKから作成済みのSLBを利用するには、マニフェストのannotationsへSLBの各種設定を行います。
今回はannotationsへSLBのIDを指定し、既存設定の上書きを有効にする事で、作成したServiceの設定がSLBへ適応されます。
※ はじめに作成したServiceは削除してから実行しています。
cat <<EOF | kubectl apply -f -apiVersion: v1kind: Servicemetadata:annotations:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-0iw0i70ijok17wfemjm4x" # SLBのIDを指定しますservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true" # 既存設定を上書きしますlabels:run: nginxname: nginxspec:ports:- port: 80protocol: TCPtargetPort: 80selector:run: nginxtype: LoadBalancerEOF
Serviceには作成したSLBが設定され、リスナーや仮想サーバグループが設定されている事がコンソールからも確認できます。
# kubectl get svc -l run=nginxNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx LoadBalancer 172.21.13.199 47.245.7.99 80:31824/TCP 56s
この他にも、annotationsへはSLBの各種設定を細かく設定する事が可能となっています。
詳しくは以下のドキュメントを参照頂ければと思います。
ストレージ
続いて、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からマウントしています。
Cloud Disk
ではCloud Diskから設定します。
ボリュームとして利用するCloud Diskを事前に作成しておきます。
作成したCloud DiskのディスクIDとゾーンを指定し、Persistent VolumesとPersistentVolumeClaimを設定します。
cat <<EOF | kubectl apply -f -apiVersion: v1kind: PersistentVolumemetadata:name: disk-pvlabels:alicloud-pvname: static-disk-pvspec:capacity:storage: 20GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Retaincsi:driver: diskplugin.csi.alibabacloud.comvolumeHandle: d-6we0wdz6sdpzip9uyj0e # Cloud Disk ID を指定しますnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: topology.diskplugin.csi.alibabacloud.com/zoneoperator: Invalues:- ap-northeast-1b # アタッチ先のNodeのゾーンを指定します---apiVersion: v1kind: PersistentVolumeClaimmetadata:name: disk-pvcspec:accessModes:- ReadWriteOnceresources:requests:storage: 20Giselector:matchLabels:alicloud-pvname: static-disk-pvEOF
NAS
次にNASを設定します。
事前にNASを作成しマウントポイントを追加しておきます。
NASへ追加したマウントポイント「2536074bee3-uav64.ap-northeast-1.nas.aliyuncs.com」を指定し、Persistent VolumesとPersistentVolumeClaimを設定します。
cat <<EOF | kubectl apply -f -apiVersion: v1kind: PersistentVolumemetadata:name: nas-pvlabels:alicloud-pvname: nas-pvspec:capacity:storage: 5GiaccessModes:- ReadWriteManycsi:driver: nasplugin.csi.alibabacloud.comvolumeHandle: nas-pvvolumeAttributes:server: "2536074bee3-uav64.ap-northeast-1.nas.aliyuncs.com" # マウントポイントを指定しますpath: "/csi"vers: "3"options: "noresvport,nolock"---kind: PersistentVolumeClaimapiVersion: v1metadata:name: nas-pvcspec:accessModes:- ReadWriteManyresources:requests:storage: 5Giselector:matchLabels:alicloud-pvname: nas-pvEOF
Object Storage Service (OSS)
OSSも同様に事前にバケットを作成しておきます。
今回は「oss-volume」と言う名前でバケットを作成しました。
作成したバケット利用する為、AccessKey ID とAccessKey の設定が必要となります。
こちらは、KubernetesのSecretへ登録します。
※ AccessKey ID とAccessKeyの値はマスクしています。
cat <<EOF | kubectl apply -f -apiVersion: v1kind: Secretmetadata:name: oss-secretnamespace: defaultstringData:akId: ***akSecret: ***EOF
次にPersistent Volumesの設定ですが、先ほど登録したSecret、作成したOSSのバケット、OSSのエンドポイントを指定します。
cat <<EOF | kubectl apply -f -apiVersion: v1kind: PersistentVolumeClaimmetadata:name: oss-pvcspec:accessModes:- ReadWriteManyresources:requests:storage: 5Gi---apiVersion: v1kind: PersistentVolumemetadata:name: oss-pvspec:capacity:storage: 5GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retaincsi:driver: ossplugin.csi.alibabacloud.comvolumeHandle: data-idnodePublishSecretRef:name: oss-secret # AccessKeyIDとAccessKeyを設定したSecretを指定namespace: defaultvolumeAttributes:bucket: "oss-volume" #バケットを指定url: "oss-ap-northeast-1-internal.aliyuncs.com" # OSSのエンドポイントを指定otherOpts: "-o max_stat_cache_size=0 -o allow_other"EOF
ボリューム確認
作成したボリュームを確認してみます。各ストレージのボリュームが作成されています。
# kubectl get pv,pvcNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpersistentvolume/disk-pv 20Gi RWO Retain Bound default/disk-pvc 3m56spersistentvolume/nas-pv 5Gi RWX Retain Bound default/nas-pvc 3m35spersistentvolume/oss-pv 5Gi RWX Retain Bound default/oss-pvc 3m21sNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEpersistentvolumeclaim/disk-pvc Bound disk-pv 20Gi RWO 3m56spersistentvolumeclaim/nas-pvc Bound nas-pv 5Gi RWX 3m35spersistentvolumeclaim/oss-pvc Bound oss-pv 5Gi RWX 3m21s
先ほど作成した各ボリュームのPersistentVolumeClaim、マウント先を指定してPodを作成します。
cat <<EOF | kubectl apply -f -apiVersion: v1kind: Podmetadata:labels:run: busyboxname: busyboxspec:containers:- image: busyboxname: busyboxargs:- /bin/sh- -c- sleep 3600volumeMounts:- name: disk-pvcmountPath: /disk # Cloud Diskのマウント先- name: nas-pvcmountPath: /nas # NASのマウント先- name: oss-pvcmountPath: /oss # OSSのマウント先volumes:- name: disk-pvcpersistentVolumeClaim:claimName: disk-pvc # CloudDisk PVC- name: nas-pvcpersistentVolumeClaim:claimName: nas-pvc # NAS PVC- name: oss-pvcpersistentVolumeClaim:claimName: oss-pvc # OSS PVCEOF
起動した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% /disk2536074bee3-qnd82.ap-northeast-1.nas.aliyuncs.com:/csinfs 10.0P 0 10.0P 0% /nas
まとめ
今回はACKからロードバランサー(SLB)と、Cloud Disk, NAS, OSSの連携を試してみました。
各実行手順については、リンク先のドキュメントへも記載されていますので、ぜひ合わせてご覧頂ければと思います。
次回はLog Service, RAM等の連携についてご紹介出来ればと思います。
最後までお読み頂き、ありがとうございました。