nginx
Azure
docker
kubernetes
AKS

誰でも簡単!AzureでKubernetesを始めよう

ゴール

Azure Kubernetes Service(以下AKS)でNginxを動かして、Azure FilesをコンテナにマウントしコンテンツをAzure Filesに置く

スクリーンショット 2018-06-11 14.00.27.png

前提

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用に新しくリソースグループを作成します。

CreateResourceGroup
$ az group create --name $ResourceGroup --location eastus

AKS Clusterの作成

nodeを1つでサイズはStandard_A1で作成しています。
AKSClusterはお金かからないのでnodeのVMの料金だけ。のはず。。。
スクリーンショット 2018-06-11 14.43.11.png

CreateAKSCluster
$ az aks create --resource-group $ResourceGroup --name $AKSCLuster_Name --node-count 1 --generate-ssh-keys --node-vm-size Standard_A1

kube/configの取得

Get".kube/config"
$ az aks get-credentials --resource-group $ResourceGroup --name $AKSCLuster_Name

Azure Container Registry(ACR)の作成

ACRは、Dockerコンテナーイメージ用のAzureのプライベート レジストリです。ACRにpushされたコンテナイメージからk8sのpod,replicasetを作成します。

CreateAzureContainerRegistry
$ az acr create --resource-group $ResourceGroup --name $ACR_Name --sku Basic --output json

ACRにログイン

作成したACRにログインします。

LoginToACR
$ az acr login --name $ACR_Name

ACRのLoginServer情報を取得

クライアントPCからkubectlでAKSを操作するために".kube/config"を取得します。
既に".kube/config"ファイルが存在している場合上書きされます。

GetInfoOfLoginServer
$ 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します。

PullNginxImageToACR
$ docker push $AKSCLuster_Name/nginx:1.0

ACRのイメージの確認

pushされたかどうかの確認。

pushしたNginxイメージの確認
$ az acr repository list --name $ACR_Name --output table
pushしたNginxイメージのtagを確認
$ az acr repository show-tags --name $ACR_Name --repository nginx --output table

ACR認証の構成

AKSとACRとの間で認証が構成されている必要があります。 その際、ACRからイメージをpullするための適切な権限を AKSのIDに付与します。
まず、AKS に対して構成されているサービス プリンシパルの IDとACRのリソースIDを取得します。
その後、適切なアクセス権を付与するロールを作成します。

ACRAuth
$ 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"となっていますが、ここは変数は使えないです。

manufest.yaml
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ファイル共有を作成する方法を定義します。 クラス内に特定のストレージアカウントを指定できます。

Create_PV_AzureFiles.yaml
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にします。

Create_PVC_AzureFiles.yaml
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ファイルにマウントします。

manufest.yaml
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ファイルを置きます。

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>
ServiceのEXTERNAL-IPの確認
$ kubectl get svc nginx --watch

EXTERNAL-IPにアクセスして"Hello kubernetes!"が表示されれば完了です!
スクリーンショット 2018-06-11 14.00.27.png