Red Hat OpenShift on IBM CloudのクラスターをAmazon EKS ConnectorでEKSコンソールに接続する

# Amazon EKS Connector

Amazon EKS Connectorは、EKS外の既存のKubernetesクラスターをAmazon EKSコンソールで表示することができる機能です。操作ができるわけではありません。これで何がうれしいかは難しいところですが、複数のKubernetesクラスターを一見一元管理できているように見えるので、マルチクラウド環境でクラスタが乱立した際に、マネージメント向けの印象は良くなるかもしれません。

# 目的

今回はIBM CloudのRed Hat OpenShift on IBM Cloud（ROKS）をEKS ConnectorでEKSコンソールに表示してみます。

なお、2021年9月時点のEKS ConnectorはまだPreviewリリースのため、GA後の仕様は変更される可能性があります。


# 手順

公式ガイドはこちらです。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/eks-connector.html

## IAMポリシーの追加（AWS）

下記ファイルを作成します。

```eks-connector-agent-trust-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SSMAccess",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "ssm.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

```eks-connector-agent-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SsmControlChannel",
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel"
            ],
            "Resource": "arn:aws:eks:*:*:cluster/*"
        },
        {
            "Sid": "ssmDataplaneOperations",
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenDataChannel",
                "ssmmessages:OpenControlChannel"
            ],
            "Resource": "*"
        }
    ]
}
```

IAMに登録します。

```
$ aws iam create-role --role-name AmazonEKSConnectorAgentRole --assume-role-policy-document file://eks-connector-agent-trust-policy.json
$ aws iam put-role-policy --role-name AmazonEKSConnectorAgentRole --policy-name AmazonEKSConnectorAgentPolicy --policy-document file://eks-connector-agent-policy.json
```

## クラスタの登録（AWS）

今回はCLIを使います。

```
$ aws eks register-cluster --name roks-public-tok --connector-config roleArn=arn:aws:iam::************:role/AmazonEKSConnectorAgentRole,provider="OPENSHIFT"
```

EKSコンソールを確認します。一覧にクラスターが表示され、ステータスが保留中となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/9986ce1f-fce0-fe6f-eb33-b6b1868e2e4b.png)

クラスターを選択するとマニフェストファイルがダウンロードできます。この操作は1回しかできませんので、必ずダウンロードしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/5241960e-14b8-67ca-32ae-eac6f7336e72.png)

## ServiceAccountの変更（IBM Cloud）

ガイドには記載がなく、OpenShift固有の手順です。EKS ConnectorのPod内にrootユーザーで実行されるコンテナがあるため、rootで実行可能なようにServiceAccountにSCCを設定します。

```
$ oc create ns eks-connector
namespace/eks-connector created

$ oc create sa eks-connector -n eks-connector
serviceaccount/eks-connector created

$ oc adm policy add-scc-to-user anyuid -z eks-connector -n eks-connector
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:anyuid added: "eks-connector"
```

## EKS Connectorのデプロイ（IBM Cloud）

先ほどダウンロードしたマニフェストファイルを登録します。

```
$ oc apply -f roks-public-tok.yaml
Warning: oc apply should be used on resource created by either oc create --save-config or oc apply
namespace/eks-connector configured
secret/eks-connector-activation-config created
role.rbac.authorization.k8s.io/eks-connector-secret-access created
serviceaccount/eks-connector created
secret/eks-connector-token created
rolebinding.rbac.authorization.k8s.io/eks-connector-secret-access created
configmap/eks-connector-agent created
statefulset.apps/eks-connector created
```

EKSコンソールで確認します。この段階ではエラーになりますが、ステータスがアクティブになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/cb1250bb-9a99-23eb-c657-a4a21546a1a8.png)

## ClusterRoleの設定（IBM Cloud）

テンプレートをダウンロードします。

```
$ curl -o eks-connector-clusterrole.yaml https://amazon-eks.s3.us-west-2.amazonaws.com/eks-connector/manifests/eks-connector-console-roles/eks-connector-clusterrole.yaml
```

最下部の%IAM_ARN%を自ユーザーのARNに書き換えます。

```eks-connector-clusterrole.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: eks-connector-service
subjects:
  - kind: ServiceAccount
    name: eks-connector
    namespace: eks-connector
roleRef:
  kind: ClusterRole
  name: eks-connector-service
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: eks-connector-service
rules:
  - apiGroups: [ "" ]
    resources:
      - users
    verbs:
      - impersonate
    resourceNames:
      # TODO: 1. ADD your IAM identity arn here
      # - "%IAM_ARN%"
      - arn:aws:iam::************:user/teru
```

ClusterRoleを追加します。

```
$ oc apply -f eks-connector-clusterrole.yaml
clusterrolebinding.rbac.authorization.k8s.io/eks-connector-service created
clusterrole.rbac.authorization.k8s.io/eks-connector-service created
```

続いてもう1つテンプレートをダウンロードします。

```
$ curl -o eks-connector-console-dashboard-full-access-group.yaml https://amazon-eks.s3.us-west-2.amazonaws.com/eks-connector/manifests/eks-connector-console-roles/eks-connector-console-dashboard-full-access-group.yaml
```

こちらも同様に%IAM_ARN%を変更します。

```eks-connector-console-dashboard-full-access-group.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: eks-connector-console-dashboard-full-access-clusterrole
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - namespaces
  - pods
  - events
  verbs:
  - get
  - list
- apiGroups:
  - apps
  resources:
  - deployments
  - daemonsets
  - statefulsets
  - replicasets
  verbs:
  - get
  - list
- apiGroups:
  - batch
  resources:
  - jobs
  verbs:
  - get
  - list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: eks-connector-console-dashboard-full-access-clusterrole-binding
subjects:
- kind: User
  # name: "%IAM_ARN%"
  name: arn:aws:iam::************:user/teru
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: eks-connector-console-dashboard-full-access-clusterrole
  apiGroup: rbac.authorization.k8s.io
---
```

ClusterRoleを登録します。

```
$ oc apply -f eks-connector-console-dashboard-full-access-group.yaml
clusterrole.rbac.authorization.k8s.io/eks-connector-console-dashboard-full-access-clusterrole created
clusterrolebinding.rbac.authorization.k8s.io/eks-connector-console-dashboard-full-access-clusterrole-binding created
```

## EKSコンソールの確認（AWS）

画面をリロードするとROKSの状態が確認できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/e6f731a1-f13d-1e8a-a762-481b92e7833b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/99498817-48ac-863f-7a8f-c577c5b29a64.png)

# まとめ

基本は公式ガイド通りですが、ROKS（OpenShift）固有でSCC設定が追加で必要となります。