Installing Che on AWS :: Eclipse Che Documentation の手順をベースにやってみる。
差分は以下。
- DNS は
nip.io
を利用 - HTTPS 化はしない
- シングルユーザーモード
chectl
を使わず、 helm チャートでデプロイ- Ingress に静的 IP を割り当て
前提
- OS: Windows 10 Pro
- Docker: Docker version 20.10.5, build 55c4c88
- 使用イメージ: mikoto2000/eks-tools
- AWS アカウント作成済み
IAM キーの作成
とりあえずルートユーザーのアクセスキーを作ってそれを使用する。
本来なら IAM ユーザーに適切な権限を付与したうえで、その人のアクセスキーを作成するべきらしい。
- AWS マネジメントコンソールに「ルートユーザー」としてログイン
- 右上のアカウント名 ->
マイセキュリティ資格情報
->アクセスキー (アクセスキー ID とシークレットアクセスキー)
->新しいアクセスキーの作成
を押下 キーファイルのダウンロード
あとで使うので適切な場所に保存しておく。
必要なツールの準備
今回は、 mikoto2000/eks-tools を使用し、足りないツールを継ぎ足していく。
mikoto2000/eks-tools には、以下ツールがインストール済み。
- AWS CLI
- kubectl
- helm
コンテナ起動後、足りないツール類をインストールする。
kops のインストール
Installing Kubernetes with kops | Kubernetes に kops のインストール手順が記載されているので、その通りに実行。
curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
chmod +x kops-linux-amd64
mv kops-linux-amd64 /usr/local/bin/kops
ssh のインストール
kops で Kubernetes クラスターへ接続するための SSH 鍵を作成するために、 ssh をインストール。
ついでに鍵作成もしておく。
bind-utils のインストール
ingress の EXTERNAL-IP(ホスト名) から IP アドレスを取得するために dig
コマンドを使いたいのでインストール。
git のインストール
Eclipse Che のデプロイ関連ソース取得のため。
jq のインストール
AWS からの出力を解析するため。
必要な情報整理
export KOPS_CLUSTER_NAME=eclipse-che.k8s.local
export KOPS_STATE_STORE=s3://${KOPS_CLUSTER_NAME}-kops-state-store
AWS の環境構築
aws-cli の設定
aws configure
コマンドで、 IAM キー情報とリージョン・出力形式を設定する。
bash-4.2# aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Default region name [None]: ap-northeast-1
Default output format [None]: json
SSH 鍵作成
kops 管理情報保存用の s3 を作成
AWS Load Balancer Controller 用のセキュリティーポリシー設定
Kubernetes ノードがロードバランサーに EIP を指定できるようにするため、 AWS Load Balancer Controller 用のポリシーを追加する。
IAM ポリシー定義の取得
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.2/docs/install/iam_policy.json
IAM ポリシー作成
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam-policy.json
nodes インスタンスに IAM ポリシーの ARN 確認
AWS_POLICY=$(aws iam list-policies | jq -r '. | .Policies[] | select(.PolicyName == "AWSLoadBalancerControllerIAMPolicy") | .Arn')
Kubernetes クラスターの作成
クラスター設定のテンプレートファイルを生成
kops create cluster --name ${KOPS_CLUSTER_NAME} \
--dry-run=true \
--zones="ap-northeast-1a" \
--output=yaml > manifest.yaml
生成した manifest.yaml
内の kind: Cluster
の spec
下に externalPolicies/node
を追加し、作成したポリシーの ARN(${AWS_POLICY}) を設定する。
...(snip)
spec:
externalPolicies:
node:
- arn:aws:iam::473221547422:policy/AWSLoadBalancerControllerIAMPolicy
api:
...(snip)
kops を使って Kubernetes クラスターを作成する。
kops create -f manifest.yaml
kops create secret --name ${KOPS_CLUSTER_NAME} sshpublickey admin -i ~/.ssh/id_rsa.pub
kops update cluster --yes
kops export kubecfg --admin
作成したクラスタの確認。
クラスタ起動が完了すると、 kops validate cluster
で情報が返ってくる。
$ kops validate cluster --wait 10m
W0509 21:42:20.442858 354 validate_cluster.go:221] (will retry): cluster not yet healthy
INSTANCE GROUPS
NAME ROLE MACHINETYPE MIN MAX SUBNETS
master-ap-northeast-1a Master t3.medium 1 1 ap-northeast-1a
nodes-ap-northeast-1a Node t3.medium 1 1 ap-northeast-1a
NODE STATUS
NAME ROLE READY
ip-172-20-45-137.ap-northeast-1.compute.internal node True
ip-172-20-57-182.ap-northeast-1.compute.internal master True
Your cluster eclipse-che.k8s.local is ready
あとは kubectl
で操作できる。
bash-4.2# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5489b75945-c8gzm 1/1 Running 0 33s
kube-system coredns-5489b75945-l5f5g 1/1 Running 0 2m3s
kube-system coredns-autoscaler-6f594f4c58-nzzdg 1/1 Running 0 2m3s
kube-system dns-controller-8574dcc89d-559w8 1/1 Running 0 2m3s
kube-system etcd-manager-events-ip-172-20-57-182.ap-northeast-1.compute.internal 1/1 Running 0 79s
kube-system etcd-manager-main-ip-172-20-57-182.ap-northeast-1.compute.internal 1/1 Running 0 96s
kube-system kops-controller-nbfwr 1/1 Running 0 2m3s
kube-system kube-apiserver-ip-172-20-57-182.ap-northeast-1.compute.internal 2/2 Running 2 2m6s
kube-system kube-controller-manager-ip-172-20-57-182.ap-northeast-1.compute.internal 1/1 Running 0 2m2s
kube-system kube-proxy-ip-172-20-45-137.ap-northeast-1.compute.internal 1/1 Running 0 54s
kube-system kube-proxy-ip-172-20-57-182.ap-northeast-1.compute.internal 1/1 Running 0 111s
kube-system kube-scheduler-ip-172-20-57-182.ap-northeast-1.compute.internal 1/1 Running 0 96s
AWS Load Balancer Controller のインストール
helm repo add eks https://aws.github.io/eks-charts
kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=${KOPS_CLUSTER_NAME}
Ingress のインストール
Elastic IP の作成
aws ec2 allocate-address \
--tag-specifications "ResourceType=elastic-ip, Tags=[{Key=Name, Value=${KOPS_CLUSTER_NAME}.ingress}]"
INGRESS_EIP_ID=$(aws ec2 describe-addresses --filters Name=tag-value,Values=eclipse-che.k8s.local.ingress --query "Addresses[0].AllocationId" --output text)
INGRESS_EIP_IP=$(aws ec2 describe-addresses --filters Name=tag-value,Values=eclipse-che.k8s.local.ingress --query "Addresses[0].PublicIp" --output text)
Ingress マニフェスト取得
curl -o ingress.yaml -L https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.0/deploy/static/provider/aws/deploy.yaml
Ingress マニフェスト修正
先ほど作成した EIP を割り当てるようにマニフェストを修正。
# Source: ingress-nginx/templates/controller-service.yaml
内の metadata/annotations
に service.beta.kubernetes.io/aws-load-balancer-eip-allocations
を追加し、 EIP の ID を指定する。
...(snip)
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: 'true'
service.beta.kubernetes.io/aws-load-balancer-type: nlb
service.beta.kubernetes.io/aws-load-balancer-eip-allocations: eipalloc-0562e26282f012ea8
...(snip)
Ingress デプロイ
ingress-nginx-congroller が実行中になることを確認。
bash-4.2# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx ingress-nginx-admission-create-8zq62 0/1 Completed 0 29s
ingress-nginx ingress-nginx-admission-patch-clbz8 0/1 Completed 0 29s
ingress-nginx ingress-nginx-controller-85b8d88cf5-mgwvt 1/1 Running 0 30s
kube-system aws-load-balancer-controller-598bd55f59-lp7rq 1/1 Running 0 8m36s
kube-system coredns-5489b75945-c8gzm 1/1 Running 0 19m
kube-system coredns-5489b75945-l5f5g 1/1 Running 0 20m
kube-system coredns-autoscaler-6f594f4c58-nzzdg 1/1 Running 0 20m
kube-system dns-controller-8574dcc89d-559w8 1/1 Running 0 20m
kube-system etcd-manager-events-ip-172-20-57-182.ap-northeast-1.compute.internal 1/1 Running 0 20m
kube-system etcd-manager-main-ip-172-20-57-182.ap-northeast-1.compute.internal 1/1 Running 0 20m
kube-system kops-controller-nbfwr 1/1 Running 0 20m
kube-system kube-apiserver-ip-172-20-57-182.ap-northeast-1.compute.internal 2/2 Running 2 20m
kube-system kube-controller-manager-ip-172-20-57-182.ap-northeast-1.compute.internal 1/1 Running 0 20m
kube-system kube-proxy-ip-172-20-45-137.ap-northeast-1.compute.internal 1/1 Running 0 19m
kube-system kube-proxy-ip-172-20-57-182.ap-northeast-1.compute.internal 1/1 Running 0 20m
kube-system kube-scheduler-ip-172-20-57-182.ap-northeast-1.compute.internal 1/1 Running 0 20m
外部公開 IP アドレスを確認。
CHE_HOST_NAME="$(kubectl get services --namespace ingress-nginx -o jsonpath='{.items[].status.loadBalancer.ingress[0].hostname}')"
DOMAIN_IP="$(dig +short ${CHE_HOST_NAME})"
DOMAIN="$(echo ${DOMAIN_IP} | sed -e "s/\./-/g").nip.io"
Eclipse Che のデプロイ
git clone --depth 1 https://github.com/eclipse/che
cd che/deploy/kubernetes/helm/che/
helm dependency update
kubectl create namespace che
helm upgrade --install che --namespace che --set global.cheWorkspacesNamespace="che" --set global.ingressDomain=${DOMAIN} ./
kubectl get pods
で che の Pod が立ち上がったことを確認。
bash-4.2# kubectl get pods -n che
NAME READY STATUS RESTARTS AGE
che-56bddc9f89-5czv2 1/1 Running 0 83s
che-dashboard-649cb64655-cv9zm 1/1 Running 0 83s
devfile-registry-7f5f8fdf4d-4b88t 1/1 Running 0 83s
plugin-registry-558796b4bd-d9wm5 1/1 Running 0 83s
ブラウザで che-che.$DOMAIN
にアクセス。
以上。
HTTP 通信・シングルユーザーモードでデプロイしているので、速やかに削除。
ルートユーザーのアクセスキーの削除も忘れず行う。
参考資料
- IAM roles - kOps - Kubernetes Operations
- kopsを使ってKubernetesクラスタをAWS上で構成 | Amazon Web Services ブログ
- list-policies — AWS CLI 2.2.3 Command Reference
- jqでちょっぴり複雑な検索をする - Qiita
- IAM roles - kOps - Kubernetes Operations
- AWS Load Balancer コントローラー - Amazon EKS
- Installation Guide - AWS LoadBalancer Controller
- Kops on AWS コトハジメ - Engineering blog at ktrysmt
0 件のコメント:
コメントを投稿