ゴール
Azure Kubernetes Service(以下AKS)でNginxを動かして、Azure FilesをコンテナにマウントしコンテンツをAzure Filesに置く
前提
Azureアカウントを持ってること
kubernetesについてなんとなく知っていること
kubectlがクライアントPCにインストールされていること
クライアントPCはMac
azure-cliのインストール
下記のページを参考にazure-cliのインストールをしてください。
MacにAzure-cliをインストール
AzureKuberneetsServiceでNginxを動かす
変数
azure-cliでいろいろ作っていく前に変数の準備をします。
ResourceGroup="YourResourceGroupName"
ACR_Name="YourAzureContainerRegistryName"
AKSCLuster_Name="YourClusterame"
StorageAccount_Name="YourStorageAccountName"
リソースグループの作成
まずはAKS,ACR用に新しくリソースグループを作成します。
$ az group create --name $ResourceGroup --location eastus
AKS Clusterの作成
nodeを1つでサイズはStandard_A1で作成しています。
AKSClusterはお金かからないのでnodeのVMの料金だけ。のはず。。。
$ az aks create --resource-group $ResourceGroup --name $AKSCLuster_Name --node-count 1 --generate-ssh-keys --node-vm-size Standard_A1
kube/configの取得
$ az aks get-credentials --resource-group $ResourceGroup --name $AKSCLuster_Name
Azure Container Registry(ACR)の作成
ACRは、Dockerコンテナーイメージ用のAzureのプライベート レジストリです。ACRにpushされたコンテナイメージからk8sのpod,replicasetを作成します。
$ az acr create --resource-group $ResourceGroup --name $ACR_Name --sku Basic --output json
ACRにログイン
作成したACRにログインします。
$ az acr login --name $ACR_Name
ACRのLoginServer情報を取得
クライアントPCからkubectlでAKSを操作するために".kube/config"を取得します。
既に".kube/config"ファイルが存在している場合上書きされます。
$ az acr list --resource-group $ResourceGroup --query "[].{acrLoginServer:loginServer}" --output json
ACRにdocker imageをpush
ACRにNginxのカスタムDockerイメージをpushします。pushするイメージは"nginx:1.0"とします。
まずはnginx:1.0イメージにtagを付与します。
$ docker tag nginx:1.0 $AKSCLuster_Name/nginx:1.0
tagを付与したらACRにpushします。
$ docker push $AKSCLuster_Name/nginx:1.0
ACRのイメージの確認
pushされたかどうかの確認。
$ az acr repository list --name $ACR_Name --output table
$ az acr repository show-tags --name $ACR_Name --repository nginx --output table
ACR認証の構成
AKSとACRとの間で認証が構成されている必要があります。 その際、ACRからイメージをpullするための適切な権限を AKSのIDに付与します。
まず、AKS に対して構成されているサービス プリンシパルの IDとACRのリソースIDを取得します。
その後、適切なアクセス権を付与するロールを作成します。
$ CLIENT_ID=$(az aks show --resource-group $ResourceGroup --name $AKSCLuster_Name --query "servicePrincipalProfile.clientId" --output tsv)
$ ACR_ID=$(az acr show --name $ACR_Name --resource-group $ResourceGroup --query "id" --output tsv)
$ az role assignment create --assignee $CLIENT_ID --role Reader --scope $ACR_ID --output json > Log/Create_Role-`date "+%Y%m%d_%H%M%S"`.json
Nginxのデプロイ
manufest.yamlファイルを実行するとnginxのreplicasetとserviceが作成されます。
※imagesが"$AKSCLuster_Name/nginx:1.0"となっていますが、ここは変数は使えないです。
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: Nginx
spec:
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: $AKSCLuster_name/nginx:1.0
ports:
- containerPort: 80
name: nginx
---
apiVersion: v1
kind: Service
metadata:
name: Nginx
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
k8sへのデプロイ進行状況を確認
$ kubectl get service nginx --watch
EXTERNAL-IPがpendingからIPに変わればデプロイ完了です。
表示されたEXTERNAL-IPにアクセスしてNginxのトップページが表示されたらOKです。
AzureFilesをマウントする
ストレージ アカウントの作成
まずはAzureFiles用のStorageAccountを作成します。
作成するResourceGroupは下記のコマンドで取得する必要があります。
$ ResourceGroup_Storage=$(az group list --output json | jq -r '.[].name' | grep MC)
$ az storage account create --resource-group $ResourceGroup_Storage --name $StorageAccount_Name --location eastus --sku Standard_LRS --output json > Log/Create_StorageAccount-`date "+%Y%m%d_%H%M%S"`.json
ストレージクラスの作成
ストレージ クラスを使用して、Azureファイル共有を作成する方法を定義します。 クラス内に特定のストレージアカウントを指定できます。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: azurefile
provisioner: kubernetes.io/azure-file
parameters:
storageAccount: YourStorageAccountName
永続ボリューム要求(PVC)の作成
PVCは、ストレージ クラス オブジェクトを使用して、Azureファイル共有を動的にプロビジョニングします。
Create_PVC_AzureFiles.yamlを実行すると、サイズが5GBでReadWriteManyアクセスの永続ボリューム要求を作成できます。
accessModesは複数ありますが、ReplicaSetから使用するのでReadWriteManyにします。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: azurefile
spec:
accessModes:
- ReadWriteMany
storageClassName: azurefile
resources:
requests:
storage: 5Gi
デプロイ
イメージはACRにpushしたカスタムNginxを使用し、Nginxのデフォルトドキュメントルート("/usr/share/nginx/html")をAzureファイルにマウントします。
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: nginx
spec:
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: $AKSCLuster_Name/nginx:1.0
ports:
- containerPort: 80
name: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: volume
volumes:
- name: volume
persistentVolumeClaim:
claimName: azurefile
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
index.htmlの設置
AzurePortalにアクセスして、作成したStorageAccountのFilesにindex.htmlファイルを置きます。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Practice K8S</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" media="screen" href="main.css" />
<script src="main.js"></script>
</head>
<body>
Hello Kubernetes!
</body>
</html>
$ kubectl get svc nginx --watch