EKS Distroをkopsで試す

EKS Distroをkopsで動かしてみたメモ。

参考リンク

手順

まずリポジトリをクローンする。

git clone git@github.com:aws/eks-distro.git
cd eks-distro

クラスター作成スクリプトを実行するが、プロファイルがap-northeast-1を向いている状態でスクリプトを実行し、us-uast-1にkopsのバケットを作ろうとすると上手くいかなかったので、ちょっとだけスクリプトを直した。

# Create the bucket if it doesn't exist
_bucket_name=$(aws s3api list-buckets  --query "Buckets[?Name=='$S3_BUCKET'].Name | [0]" --out text)
if [ $_bucket_name == "None" ]; then
    echo "Creating S3 bucket: $S3_BUCKET"
    if [ "$AWS_DEFAULT_REGION" == "us-east-1" ]; then
-       aws s3api create-bucket --bucket $S3_BUCKET
+       aws s3api create-bucket --bucket $S3_BUCKET --region us-east-1
    else
        aws s3api create-bucket --bucket $S3_BUCKET --create-bucket-configuration LocationConstraint=$AWS_DEFAULT_REGION
    fi
fi

スクリプトを実行する。

cd development/kops
./create_cluster.sh

対話に答える。ここで指定したリージョンにバケットだけでなくクラスターも作成されてしまうので、リージョンを選択したい場合は生成されたクラスター定義を編集してからクラスターを作成する必要がありそう。

$ ./create_cluster.sh
Cluster name must be an FQDN: <yourcluster>.yourdomain.com or <yourcluster>.sub.yourdomain.com
What is the name of your Cluster? myeksdcluster.sotoiwa.dev
Please set a default region for the kops config bucket (e.g. us-west-2)
What region would you like to store the config? us-east-1
Using S3 bucket kops-state-store-jqxgvzcjuqkbzgpsxodjujmlcfafdzvw: to use with kops run
Creating S3 bucket: kops-state-store-jqxgvzcjuqkbzgpsxodjujmlcfafdzvw
{
    "Location": "/kops-state-store-jqxgvzcjuqkbzgpsxodjujmlcfafdzvw"
}
W1215 16:20:47.763377    6086 root.go:251] no context set in kubecfg
Creating cluster


Created cluster/myeksdcluster.sotoiwa.dev
Created instancegroup/control-plane-us-east-1a
Created instancegroup/nodes

To deploy these resources, run: kops update cluster myeksdcluster.sotoiwa.dev --yes

Creating cluster ssh key
Do you want to create the cluster now? [Y/n] y

*********************************************************************************

A new kubernetes version is available: 1.18.12
Upgrading is recommended (try kops upgrade cluster)

More information: https://github.com/kubernetes/kops/blob/master/permalinks/upgrade_k8s.md#1.18.12

*********************************************************************************


*********************************************************************************

Kubelet anonymousAuth is currently turned on. This allows RBAC escalation and remote code execution possibilities.
It is highly recommended you turn it off by setting 'spec.kubelet.anonymousAuth' to 'false' via 'kops edit cluster'

See https://kops.sigs.k8s.io/security/#kubelet-api

*********************************************************************************

I1215 16:21:09.254257    6111 networking.go:62] Using CNI asset version "https://distro.eks.amazonaws.com/kubernetes-1-18/releases/1/artifacts/plugins/v0.8.7/cni-plugins-linux-amd64-v0.8.7.tar.gz", as set in CNI_VERSION_URL
I1215 16:21:09.254523    6111 networking.go:66] Using CNI asset hash "sha256:7426431524c2976f481105b80497238030e1c3eedbfcad00e2a9ccbaaf9eef9d", as set in CNI_ASSET_HASH_STRING
I1215 16:21:14.803035    6111 executor.go:103] Tasks: 0 done / 94 total; 45 can run
I1215 16:21:16.247255    6111 vfs_castore.go:590] Issuing new certificate: "etcd-manager-ca-main"
I1215 16:21:16.345858    6111 vfs_castore.go:590] Issuing new certificate: "etcd-peers-ca-main"
I1215 16:21:16.352367    6111 vfs_castore.go:590] Issuing new certificate: "ca"
I1215 16:21:16.358723    6111 vfs_castore.go:590] Issuing new certificate: "etcd-clients-ca"
I1215 16:21:16.382699    6111 vfs_castore.go:590] Issuing new certificate: "apiserver-aggregator-ca"
I1215 16:21:16.436799    6111 vfs_castore.go:590] Issuing new certificate: "etcd-manager-ca-events"
I1215 16:21:16.472615    6111 vfs_castore.go:590] Issuing new certificate: "etcd-peers-ca-events"
I1215 16:21:20.008759    6111 executor.go:103] Tasks: 45 done / 94 total; 29 can run
I1215 16:21:21.245835    6111 vfs_castore.go:590] Issuing new certificate: "master"
I1215 16:21:21.269008    6111 vfs_castore.go:590] Issuing new certificate: "kube-controller-manager"
I1215 16:21:21.280184    6111 vfs_castore.go:590] Issuing new certificate: "kube-scheduler"
I1215 16:21:21.306500    6111 vfs_castore.go:590] Issuing new certificate: "kubecfg"
I1215 16:21:21.370665    6111 vfs_castore.go:590] Issuing new certificate: "aws-iam-authenticator"
I1215 16:21:21.396568    6111 vfs_castore.go:590] Issuing new certificate: "apiserver-proxy-client"
I1215 16:21:21.442213    6111 vfs_castore.go:590] Issuing new certificate: "kops"
I1215 16:21:21.486057    6111 vfs_castore.go:590] Issuing new certificate: "kubelet-api"
I1215 16:21:21.609507    6111 vfs_castore.go:590] Issuing new certificate: "kube-proxy"
I1215 16:21:21.664793    6111 vfs_castore.go:590] Issuing new certificate: "kubelet"
I1215 16:21:22.569972    6111 vfs_castore.go:590] Issuing new certificate: "apiserver-aggregator"
I1215 16:21:24.557641    6111 executor.go:103] Tasks: 74 done / 94 total; 18 can run
I1215 16:21:29.878421    6111 executor.go:103] Tasks: 92 done / 94 total; 2 can run
I1215 16:21:31.246037    6111 executor.go:103] Tasks: 94 done / 94 total; 0 can run
I1215 16:21:31.246890    6111 dns.go:156] Pre-creating DNS records
I1215 16:21:33.902947    6111 update_cluster.go:308] Exporting kubecfg for cluster
kops has set your kubectl context to myeksdcluster.sotoiwa.dev

Cluster is starting.  It should be ready in a few minutes.

Suggestions:
 * validate cluster: kops validate cluster --wait 10m
 * list nodes: kubectl get nodes --show-labels
 * ssh to the master: ssh -i ~/.ssh/id_rsa ubuntu@api.myeksdcluster.sotoiwa.dev
 * the ubuntu user is specific to Ubuntu. If not using Ubuntu please use the appropriate user based on your OS.
 * read about installing addons at: https://kops.sigs.k8s.io/operations/addons.


You can validate your cluster with
KOPS_STATE_STORE=s3://kops-state-store-jqxgvzcjuqkbzgpsxodjujmlcfafdzvw kops validate cluster --wait 10m
Kops state is stored in s3://kops-state-store-jqxgvzcjuqkbzgpsxodjujmlcfafdzvw

You will need to manually deploy the aws authenticator config once the cluster is ready with

kubectl apply -f ./aws-iam-authenticator.yaml

作成されたクラスターの定義は以下のようになっている。

apiVersion: kops.k8s.io/v1alpha2
kind: Cluster
metadata:
  creationTimestamp: null
  name: myeksdcluster.sotoiwa.dev
spec:
  api:
    dns: {}
  authorization:
    rbac: {}
  channel: stable
  cloudProvider: aws
  configBase: s3://kops-state-store-jqxgvzcjuqkbzgpsxodjujmlcfafdzvw
  containerRuntime: docker
  etcdClusters:
  - cpuRequest: 200m
    etcdMembers:
    - instanceGroup: control-plane-us-east-1a
      name: a
    memoryRequest: 100Mi
    name: main
  - cpuRequest: 100m
    etcdMembers:
    - instanceGroup: control-plane-us-east-1a
      name: a
    memoryRequest: 100Mi
    name: events
  iam:
    allowContainerRegistry: true
    legacy: false
  kubelet:
    anonymousAuth: false
  kubernetesApiAccess:
  - 0.0.0.0/0
  kubernetesVersion: https://distro.eks.amazonaws.com/kubernetes-1-18/releases/1/artifacts/kubernetes/v1.18.9
  masterPublicName: api.myeksdcluster.sotoiwa.dev
  networkCIDR: 172.20.0.0/16
  networking:
    kubenet: {}
  nonMasqueradeCIDR: 100.64.0.0/10
  sshAccess:
  - 0.0.0.0/0
  subnets:
  - cidr: 172.20.32.0/19
    name: us-east-1a
    type: Public
    zone: us-east-1a
  - cidr: 172.20.64.0/19
    name: us-east-1b
    type: Public
    zone: us-east-1b
  - cidr: 172.20.96.0/19
    name: us-east-1c
    type: Public
    zone: us-east-1c
  topology:
    dns:
      type: Public
    masters: public
    nodes: public
  kubeAPIServer:
    image: public.ecr.aws/eks-distro/kubernetes/kube-apiserver:v1.18.9-eks-1-18-1
  kubeControllerManager:
    image: public.ecr.aws/eks-distro/kubernetes/kube-controller-manager:v1.18.9-eks-1-18-1
  kubeScheduler:
    image: public.ecr.aws/eks-distro/kubernetes/kube-scheduler:v1.18.9-eks-1-18-1
  kubeProxy:
    image: public.ecr.aws/eks-distro/kubernetes/kube-proxy:v1.18.9-eks-1-18-1
  # Metrics Server will be supported with kops 1.19
  metricsServer:
    enabled: true
    image: public.ecr.aws/eks-distro/kubernetes-sigs/metrics-server:v0.4.0-eks-1-18-1
  authentication:
    aws:
      image: public.ecr.aws/eks-distro/kubernetes-sigs/aws-iam-authenticator:v0.5.2-eks-1-18-1
  kubeDNS:
    provider: CoreDNS
    coreDNSImage: public.ecr.aws/eks-distro/coredns/coredns:v1.7.0-eks-1-18-1
    externalCoreFile: |
      .:53 {
          errors
          health {
            lameduck 5s
          }
          kubernetes cluster.local. in-addr.arpa ip6.arpa {
            pods insecure
            #upstream
            fallthrough in-addr.arpa ip6.arpa
          }
          prometheus :9153
          forward . /etc/resolv.conf
          loop
          cache 30
          loadbalance
          reload
      }
  masterKubelet:
    podInfraContainerImage: public.ecr.aws/eks-distro/kubernetes/pause:v1.18.9-eks-1-18-1
  # kubelet might already be defined, append the following config
  kubelet:
    podInfraContainerImage: public.ecr.aws/eks-distro/kubernetes/pause:v1.18.9-eks-1-18-1

---

apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
  creationTimestamp: null
  labels:
    kops.k8s.io/cluster: myeksdcluster.sotoiwa.dev
  name: control-plane-us-east-1a
spec:
  image: 099720109477/ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-20201026
  machineType: t3.medium
  maxSize: 1
  minSize: 1
  nodeLabels:
    kops.k8s.io/instancegroup: control-plane-us-east-1a
  role: Master
  subnets:
  - us-east-1a

---

apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
  creationTimestamp: null
  labels:
    kops.k8s.io/cluster: myeksdcluster.sotoiwa.dev
  name: nodes
spec:
  image: 099720109477/ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-20201026
  machineType: t3.medium
  maxSize: 3
  minSize: 3
  nodeLabels:
    kops.k8s.io/instancegroup: nodes
  role: Node
  subnets:
  - us-east-1a
  - us-east-1b
  - us-east-1c

クラスターの作成完了を待つ。

KOPS_STATE_STORE=s3://kops-state-store-jqxgvzcjuqkbzgpsxodjujmlcfafdzvw kops validate cluster --wait 10m

バリデーションがいつまでも完了しないが、失敗しているのはaws-iam-authenticatorのPodなので、待っていても完了しなそう。

INSTANCE GROUPS
NAME                ROLE    MACHINETYPE MIN MAX SUBNETS
control-plane-us-east-1a    Master  t3.medium   1   1   us-east-1a
nodes               Node    t3.medium   3   3   us-east-1a,us-east-1b,us-east-1c

NODE STATUS
NAME                ROLE    READY
ip-172-20-123-145.ec2.internal  node    True
ip-172-20-44-162.ec2.internal   node    True
ip-172-20-56-21.ec2.internal    master  True
ip-172-20-92-213.ec2.internal   node    True

VALIDATION ERRORS
KIND    NAME                    MESSAGE
Pod kube-system/aws-iam-authenticator-snsng system-node-critical pod "aws-iam-authenticator-snsng" is pending

Validation Failed
W1215 16:29:55.652349    6878 validate_cluster.go:221] (will retry): cluster not yet healthy

止めて手動で適用する。

$ kubectl apply -f ./aws-iam-authenticator.yaml
configmap/aws-iam-authenticator created

もう一度バリデーションする。

$ KOPS_STATE_STORE=s3://kops-state-store-jqxgvzcjuqkbzgpsxodjujmlcfafdzvw kops validate cluster --wait 10m
Using cluster from kubectl context: myeksdcluster.sotoiwa.dev

Validating cluster myeksdcluster.sotoiwa.dev

INSTANCE GROUPS
NAME                ROLE    MACHINETYPE MIN MAX SUBNETS
control-plane-us-east-1a    Master  t3.medium   1   1   us-east-1a
nodes               Node    t3.medium   3   3   us-east-1a,us-east-1b,us-east-1c

NODE STATUS
NAME                ROLE    READY
ip-172-20-123-145.ec2.internal  node    True
ip-172-20-44-162.ec2.internal   node    True
ip-172-20-56-21.ec2.internal    master  True
ip-172-20-92-213.ec2.internal   node    True

Your cluster myeksdcluster.sotoiwa.dev is ready

確認する。

$ k get node -o wide
NAME                             STATUS   ROLES    AGE     VERSION              INTERNAL-IP      EXTERNAL-IP     OS-IMAGE             KERNEL-VERSION   CONTAINER-RUNTIME
ip-172-20-123-145.ec2.internal   Ready    node     5m43s   v1.18.9-eks-1-18-1   172.20.123.145   34.229.194.96   Ubuntu 20.04.1 LTS   5.4.0-1029-aws   docker://19.3.11
ip-172-20-44-162.ec2.internal    Ready    node     5m34s   v1.18.9-eks-1-18-1   172.20.44.162    3.237.65.147    Ubuntu 20.04.1 LTS   5.4.0-1029-aws   docker://19.3.11
ip-172-20-56-21.ec2.internal     Ready    master   7m4s    v1.18.9-eks-1-18-1   172.20.56.21     3.239.123.140   Ubuntu 20.04.1 LTS   5.4.0-1029-aws   docker://19.3.11
ip-172-20-92-213.ec2.internal    Ready    node     5m48s   v1.18.9-eks-1-18-1   172.20.92.213    52.55.213.153   Ubuntu 20.04.1 LTS   5.4.0-1029-aws   docker://19.3.11
$ k get po -A -o wide
NAMESPACE     NAME                                                   READY   STATUS    RESTARTS   AGE     IP               NODE                             NOMINATED NODE   READINESS GATES
kube-system   aws-iam-authenticator-snsng                            1/1     Running   0          6m24s   172.20.56.21     ip-172-20-56-21.ec2.internal     <none>           <none>
kube-system   coredns-6fc4c7f56d-9ldzr                               1/1     Running   0          7m20s   100.96.1.3       ip-172-20-92-213.ec2.internal    <none>           <none>
kube-system   coredns-6fc4c7f56d-dmlr2                               1/1     Running   0          5m29s   100.96.3.2       ip-172-20-44-162.ec2.internal    <none>           <none>
kube-system   coredns-autoscaler-78c9dc7f45-mkxcx                    1/1     Running   0          7m20s   100.96.1.2       ip-172-20-92-213.ec2.internal    <none>           <none>
kube-system   dns-controller-85fb76bb5b-nnrml                        1/1     Running   0          7m20s   172.20.56.21     ip-172-20-56-21.ec2.internal     <none>           <none>
kube-system   etcd-manager-events-ip-172-20-56-21.ec2.internal       1/1     Running   0          6m56s   172.20.56.21     ip-172-20-56-21.ec2.internal     <none>           <none>
kube-system   etcd-manager-main-ip-172-20-56-21.ec2.internal         1/1     Running   0          6m39s   172.20.56.21     ip-172-20-56-21.ec2.internal     <none>           <none>
kube-system   kops-controller-4vljx                                  1/1     Running   0          6m24s   172.20.56.21     ip-172-20-56-21.ec2.internal     <none>           <none>
kube-system   kube-apiserver-ip-172-20-56-21.ec2.internal            2/2     Running   0          6m29s   172.20.56.21     ip-172-20-56-21.ec2.internal     <none>           <none>
kube-system   kube-controller-manager-ip-172-20-56-21.ec2.internal   1/1     Running   0          6m51s   172.20.56.21     ip-172-20-56-21.ec2.internal     <none>           <none>
kube-system   kube-proxy-ip-172-20-123-145.ec2.internal              1/1     Running   0          4m50s   172.20.123.145   ip-172-20-123-145.ec2.internal   <none>           <none>
kube-system   kube-proxy-ip-172-20-44-162.ec2.internal               1/1     Running   0          5m24s   172.20.44.162    ip-172-20-44-162.ec2.internal    <none>           <none>
kube-system   kube-proxy-ip-172-20-56-21.ec2.internal                1/1     Running   0          6m24s   172.20.56.21     ip-172-20-56-21.ec2.internal     <none>           <none>
kube-system   kube-proxy-ip-172-20-92-213.ec2.internal               1/1     Running   0          6m1s    172.20.92.213    ip-172-20-92-213.ec2.internal    <none>           <none>
kube-system   kube-scheduler-ip-172-20-56-21.ec2.internal            1/1     Running   0          6m42s   172.20.56.21     ip-172-20-56-21.ec2.internal     <none>           <none>