フォーム読み込み中
2022年8月31日掲載
これまでAlibabaCloud、Microsoft Azure、Google CloudのKubernetesでNextcloudを構築する手順を紹介しました。
今回は同じアプローチながら、AWSのEKSを使って、Nextcloudを構築してみたいと思います。AlibabaCloud、Microsoft Azure、Google Cloudと比較して構築手順が複雑です。注意点もいくつかありますので、順を追って説明していきたいと思います。
AWSのElastic Kubernetes Service(EKS)上でのNextcloudのデプロイとして、全体構成図は次の通りになります。
筆者はWindows PCで操作するため、Windowsでパッケージ管理ツールのChocolateyをインストールします。
◆Chocolatelyのインストール
$ @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin“
Chocolateyのインストールが完了したら、EKS で Kubernetes クラスターを作成および管理するためにeksctlというコマンドラインツールをインストールします。
◆eksctlインストール
$ chocolatey install -y eksctl aws-iam-authenticator
$ eksctl version
最後にAWS CLIをインストールします。本記事では説明をできるだけ簡略化するために、AWS CLIを使ってコンソールでGUI操作するより素早くクラスターを構築、操作します。
◆aws cli設定
$ aws configure
cluster.yamlファイルを作成します。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: <cluster名>
region: ap-northeast-1
nodeGroups:
- name: ng1
desiredCapacity: 2
instanceType: t2.micro
ssh:
publicKeyName: <PublicKey名>
- name: ng-mixed
minSize: 1
maxSize: 3
instancesDistribution:
maxPrice: 0.017
instanceTypes: ["t2.micro"] # At least one instance type should be specified
onDemandBaseCapacity: 0
onDemandPercentageAboveBaseCapacity: 50
spotInstancePools: 2
ssh:
publicKeyName: <PublicKey名>
クラスタを作成します。
$ eksctl create cluster -f cluster.yaml
kubectlのconfigを取得します。
$ aws eks --region ap-northeast-1 update-kubeconfig --name <クラスター名>
OIDCを作成します。
$ eksctl utils associate-iam-oidc-provider --cluster <クラスター名> --approve
作成したOIDCを確認します。
$ aws iam list-open-id-connect-providers
その結果、出力結果は次のようになっていると思います。
太字は個人アカウントごとに変わりますので注意してください。
{
"OpenIDConnectProviderList": [
{
"Arn": "arn:aws:iam::<IAM> :oidc-provider/oidc.eks.ap-northeast-1.amazonaws.com/id/<id>"
}
]
}
Policyファイルを取得します。
$ curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
Policyを作成します。
$ aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document iam-policy.json
Roleを作成します。
$ aws iam create-role --role-name AmazonEKSLoadBalancerControllerRole --assume-role-policy-document file://"load-balancer-role-trust-policy.json"
load-balancer-role-trust-policy.jsonの中身に以下のIAM設定情報を貼り付けます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::306197006344:oidc-provider/oidc.eks.ap-northeast-1.amazonaws.com/id/240DB07EE3C2028B363325018948D3F9"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.ap-northeast-1.amazonaws.com/id/240DB07EE3C2028B363325018948D3F9:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"
}
}
}
]
}
PolicyはRoleに適応します。
$ aws iam attach-role-policy --policy-arn arn:aws:iam::306197006344:policy/AWSLoadBalancerControllerIAMPolicy --role-name AmazonEKSLoadBalancerControllerRo
Cert-managerをインストールします。
$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.8.0/cert-manager.yaml
ALBコントローラーインストール用YAMLファイルをダウンロードします。
$ curl -Lo ingress-controller12.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.1/v2_4_1_full.yaml
ダウンロードしたingress-controller.yamlを編集します。
クラスタ名を変更します。
spec:
containers:
- args:
- --cluster-name=<クラスター名>
- --ingress-class=alb
ServiceAccountの設定を以下に変更します。
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/name: aws-load-balancer-controller
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::306197006344:role/AmazonEKSLoadBalancerControllerRole
name: aws-load-balancer-controller
namespace: kube-system
ALBコントローラーをインストールします。
$ kubectl apply -f ingress-controller.yaml
ALBコントローラーがインストールされたことを確認します。
$ kubectl get deployment -n kube-system aws-load-balancer-controller
https.yamlに以下の内容を貼り付けます。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nextcloud-pv-claim
labels:
app: nextcloud
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: nextcloud
labels:
app: nextcloud
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nextcloud
tier: frontend
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nextcloud
labels:
app: nextcloud
spec:
selector:
matchLabels:
app: nextcloud
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: nextcloud
tier: frontend
spec:
containers:
- image: nextcloud:latest
name: nextcloud
env:
- name: OVERWRITEHOST
value: albnextcloud.sbcicp1.net
- name: OVERWRITEPROTOCOL
value: https
ports:
- containerPort: 80
name: nextcloud
volumeMounts:
- name: nextcloud-ps
mountPath: /var/www/html
volumes:
- name: nextcloud-ps
persistentVolumeClaim:
claimName: nextcloud-pv-claim
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nextcloudingress
namespace: default
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-1:306197006344:certificate/09fd3371-93cd-4315-b6c5-00bab743e671
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
spec:
tls:
- hosts:
- albnextcloud.sbcicp1.net
secretName: sbcicp1.net
rules:
- host: albnextcloud.sbcicp1.net
http:
paths:
- backend:
service:
name: nextcloud
port:
number: 80
path: /
pathType: Prefix
Nextcloudをデプロイします。
$ kubectl apply -f https.yaml
以下の通り、「0/3 nodes are available: 3 Too many pods.」でもNodeが足りないとエラーが発生します。
Nodeを拡張します。
$ eksctl scale nodegroup --cluster=<クラスター名> --nodes=3 --name=ng-mixed
一旦PODを削除します。
POD自動で作成されますので、以下の通り、今回は正常に起動されました。
DNS登録作業をします。
$ kubectl get ingress
上記DNS登録ができたら、FQDNをタブバーのURLへ入力するとページが表示されます。
Ingressを作成する際、以下のエラーが発生。
Failed build model due to ingress: default/nextcloudingress5: multiple certificates found for host: albnextcloud.sbcicp1.net, certARNs: [arn:aws:acm:ap-northeast-1:306197006344:certificate/c0ba735f-8051-450c-a53a-d269ea19506b arn:aws:acm:ap-northeast-1:306197006344:certificate/5b0b3fea-edf3-4e83-8dbb-db55eb290e00 arn:aws:acm:ap-northeast-1:306197006344:certificate/09fd3371-93cd-4315-b6c5-00bab743e671]
Certificate Managerに同じドメインの証明書が多数存在していたことが原因だったようです。
期限切れの証明書が残っていました。
対策:
IngressのYAMLに以下の証明書を指定すると問題なくIngressを作成できます。
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-1:<IAM>:certificate/xxxxxxxxxxxxxxxxxxxxxxxxxx
ingress controllerをデプロイする際、以下のエラーが表示されますが、気にしないでそのまま進められます。
error: unable to recognize "ingress-controller.yaml": no matches for kind "IngressClassParams" in version "elbv2.k8s.aws/v1beta1"
AWSではIngress Controllerのインストールが複雑です。権限設定はStep by Stepで設定が必要です。
Ingressの設定をミスってしまい、一から作りなおしたい場合、kubectl delete ingressのコマンドでは削除できません。AWSコンソール:EC2のロードバランサーの画面で手動でロードバランサーを削除してから、kubectl delete ingressで削除できます。
クラスタを削除する際、AWSコンソールでクラスタを削除した場合、実際のリソース(ロードバランサー、EC2等)が削除されないので、eksctl delete clusterで削除したほうがいいです。
Nextcloudはオフィス版ITとして非常に便利です。別途記事にあるように、安価であるAlibaba CloudやGoogle Cloud、Azureなどにも構築できるため、クラウドベンダーを問わずにオフィス版ITとして様々な運用を行うことができます。
Special thanks to lin/bob.
条件に該当するページがございません