2021年5月10日月曜日

AWS + kops + 静的 IP + nip.io で Eclipse Che を動かす

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
  • AWS アカウント作成済み

IAM キーの作成

とりあえずルートユーザーのアクセスキーを作ってそれを使用する。

本来なら IAM ユーザーに適切な権限を付与したうえで、その人のアクセスキーを作成するべきらしい。

  1. AWS マネジメントコンソールに「ルートユーザー」としてログイン
  2. 右上のアカウント名 -> マイセキュリティ資格情報 -> アクセスキー (アクセスキー ID とシークレットアクセスキー) -> 新しいアクセスキーの作成 を押下
  3. キーファイルのダウンロード

あとで使うので適切な場所に保存しておく。

必要なツールの準備

今回は、 mikoto2000/eks-tools を使用し、足りないツールを継ぎ足していく。

mikoto2000/eks-tools には、以下ツールがインストール済み。

  • AWS CLI
  • kubectl
  • helm

コンテナ起動後、足りないツール類をインストールする。

docker run -it --rm -v "$(pwd):/work" --workdir=/work mikoto2000/eks-tools

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 をインストール。

ついでに鍵作成もしておく。

yum install -y openssh-clients

bind-utils のインストール

ingress の EXTERNAL-IP(ホスト名) から IP アドレスを取得するために dig コマンドを使いたいのでインストール。

yum install -y bind-utils

git のインストール

Eclipse Che のデプロイ関連ソース取得のため。

yum install -y git

jq のインストール

AWS からの出力を解析するため。

yum install -y jq

必要な情報整理

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 鍵作成

ssh-keygen

kops 管理情報保存用の s3 を作成

aws s3 mb ${KOPS_STATE_STORE}

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: Clusterspec 下に 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/annotationsservice.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 デプロイ

kubectl apply -f ./ingress.yaml

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 通信・シングルユーザーモードでデプロイしているので、速やかに削除。

kops delete cluster --yes
aws s3 rb ${KOPS_STATE_STORE}

ルートユーザーのアクセスキーの削除も忘れず行う。

参考資料

0 件のコメント:

コメントを投稿