冬休みでもう少し k8s に親しくなるため、適当に触る

EKS をセットアップ

eksctl からクラスター作成

eksctl create cluster
eksctl get cluster attractive-sculpture-1672376633
eksctl get nodegroup --cluster attractive-sculpture-1672376633

kubeconfig をアップデート

aws eks update-kubeconfig --region ap-northeast-1 --name attractive-sculpture-1672376633
kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   14m

Add-Onがほぼない

eksctl get addon --cluster attractive-sculpture-1672376633

コンソールから色々追加

  • CoreDNS
  • AmazonVPC CNI
  • AWS DIstro for OpenTelemetry
  • kube-proxy
eksctl get addon --cluster attractive-sculpture-1672376633
2022-12-30 14:41:03 [ℹ]  Kubernetes version "1.24" in use by cluster "attractive-sculpture-1672376633"
2022-12-30 14:41:03 [ℹ]  getting all addons
2022-12-30 14:41:06 [ℹ]  to see issues for an addon run `eksctl get addon --name <addon-name> --cluster <cluster-name>`
NAME		VERSION			STATUS	ISSUES	IAMROLE	UPDATE AVAILABLE						CONFIGURATION VALUES
coredns		v1.8.7-eksbuild.2	ACTIVE	0
kube-proxy	v1.23.7-eksbuild.1	ACTIVE	0		v1.24.7-eksbuild.2,v1.23.13-eksbuild.2,v1.23.8-eksbuild.2
vpc-cni		v1.10.4-eksbuild.1	ACTIVE	0		v1.12.0-eksbuild.1,v1.11.4-eksbuild.2,v1.11.4-eksbuild.1
kubectl get events

アプリ追加

kubectl apply -f examples/guestbook/
kubectl get pods
NAME                             READY   STATUS              RESTARTS   AGE
frontend-f7d9c57d4-8rt4b         0/1     ContainerCreating   0          9s
frontend-f7d9c57d4-h8tqx         0/1     ContainerCreating   0          9s
frontend-f7d9c57d4-lpv56         0/1     ContainerCreating   0          9s
redis-master-857d99cc8-gqrjk     0/1     ContainerCreating   0          9s
redis-replica-566d4f87dc-2tbs9   0/1     ContainerCreating   0          9s
redis-replica-566d4f87dc-nszz5   0/1     ContainerCreating   0          9s

Ingress Controller の追加

kubectl apply -f deploy.yaml
kubectl get events

AWS Console から作成

![[Pasted image 20221229143755.png]]

eksctl

eksctl register cluster --name test --provider EKS_ANYWHERE --region ap-northeast-1

# クラスター情報確認
eksctl get cluster test
NAME	VERSION	STATUS	CREATED			VPC			SUBNETS				SECURITYGROUPS		PROVIDER
test	1.24	ACTIVE	2022-12-29T03:30:06Z	vpc-0d809879c178a4b0a	subnet-066b742eb83b445be,subnet-0939c5e5328791a0c,subnet-0

# リソース確認
eksctl get nodegroup --cluster test
CLUSTER	NODEGROUP	STATUS		CREATED			MIN SIZE	MAX SIZE	DESIRED CAPACITY	INSTANCE TYPE	IMAGE ID	ASG NAME		TYPE
test	test-nodegroup	CREATE_FAILED	2022-12-29T05:17:51Z	2		2		2			t3.medium	AL2_x86_64	eks-test-nodegroup-10c2ae28-5701-cfa2-01cc-e3e3a0ea8e9e	managed

# add-on確認
eksctl get addon --cluster test
2022-12-29 16:26:35 [ℹ]  Kubernetes version "1.24" in use by cluster "test"
2022-12-29 16:26:35 [ℹ]  getting all addons
2022-12-29 16:26:37 [ℹ]  to see issues for an addon run `eksctl get addon --name <addon-name> --cluster <cluster-name>`
NAME		VERSION			STATUS		ISSUES	IAMROLE	UPDATE AVAILABLE	CONFIGURATION VALUES
coredns		v1.8.7-eksbuild.3	DEGRADED	1
kube-proxy	v1.24.7-eksbuild.2	ACTIVE		0
vpc-cni		v1.11.4-eksbuild.1	ACTIVE		0		v1.12.0-eksbuild.1

kubectl

aws eks update-kubeconfig --region ap-northeast-1 --name test
  • ekssctl : eks が管理するクラスターマスターノード周りの管理や情報確認、アドオンとかバージョンアップとか
  • kubectl : 実際にデプロイされる k8s アプリケーション側の設定とか

アプリ追加してみる

git clone git@github.com:kubernetes/examples.git

ls -la  examples/guestbook
total 64
drwxr-xr-x  14 shuaki  staff  448 Dec 29 16:53 .
drwxr-xr-x  19 shuaki  staff  608 Dec 29 16:53 ..
-rw-r--r--   1 shuaki  staff  367 Dec 29 16:53 MAINTENANCE.md
-rw-r--r--   1 shuaki  staff  239 Dec 29 16:53 README.md
drwxr-xr-x   5 shuaki  staff  160 Dec 29 16:53 all-in-one
-rw-r--r--   1 shuaki  staff  900 Dec 29 16:53 frontend-deployment.yaml
-rw-r--r--   1 shuaki  staff  437 Dec 29 16:53 frontend-service.yaml
drwxr-xr-x   5 shuaki  staff  160 Dec 29 16:53 legacy
drwxr-xr-x   7 shuaki  staff  224 Dec 29 16:53 php-redis
-rw-r--r--   1 shuaki  staff  607 Dec 29 16:53 redis-master-deployment.yaml
-rw-r--r--   1 shuaki  staff  233 Dec 29 16:53 redis-master-service.yaml
-rw-r--r--   1 shuaki  staff  947 Dec 29 16:53 redis-replica-deployment.yaml
-rw-r--r--   1 shuaki  staff  215 Dec 29 16:53 redis-replica-service.yaml
drwxr-xr-x   5 shuaki  staff  160 Dec 29 16:53 redis-slave

cat README.md
# Example: Guestbook application on Kubernetes

This directory contains the source code and Kubernetes manifests for PHP
Guestbook application.

PHPアプリがある

apply でディレクトリ指定した場合、そのディレクトリのマニフェストファイルが全部実行される

grep -rn apiVersion * -A 5

めっちゃある

kubectl apply -f examples/guestbook/

設定確認

kubectl get all
NAME                                 READY   STATUS    RESTARTS   AGE
pod/frontend-f7d9c57d4-66kpf         0/1     Pending   0          22s
pod/frontend-f7d9c57d4-kt2gc         0/1     Pending   0          22s
pod/frontend-f7d9c57d4-vgr9s         0/1     Pending   0          22s
pod/redis-master-857d99cc8-t8q7c     0/1     Pending   0          22s
pod/redis-replica-566d4f87dc-m4bx2   0/1     Pending   0          21s
pod/redis-replica-566d4f87dc-p8nq7   0/1     Pending   0          21s

NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/frontend        NodePort    10.100.214.71   <none>        80:30482/TCP   22s
service/kubernetes      ClusterIP   10.100.0.1      <none>        443/TCP        4h29m
service/redis-master    ClusterIP   10.100.31.164   <none>        6379/TCP       21s
service/redis-replica   ClusterIP   10.100.88.254   <none>        6379/TCP       21s

NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/frontend        0/3     3            0           22s
deployment.apps/redis-master    0/1     1            0           22s
deployment.apps/redis-replica   0/2     2            0           21s

NAME                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/frontend-f7d9c57d4         3         3         0       22s
replicaset.apps/redis-master-857d99cc8     1         1         0       22s
replicaset.apps/redis-replica-566d4f87dc   2         2         0       21s

外部からのアクセスを許可(Ingress Controller を追加)

https://aws.amazon.com/jp/premiumsupport/knowledge-center/eks-access-kubernetes-services/ LB配置が必要。AWS の LB もしくは、NGINXを利用

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/aws/deploy.yaml


# めちゃくちゃ長いので抜粋
cat deploy.yaml
  • namespace のデプロイ
  • serviceaccount のデプロイ : Pod から k8s API を呼び出すための認可の仕組み
    • ingress-nginx
    • ingress-nginx-admission
  • role のデプロイ : ServiceAccount の 認可を定義するもの
    • Rules : 認可の仕組み。Allow 飲み
    • ingress-nginx
      • 一杯権限ついてる
    • ingress-nginx-admission
      • 権限ほぼついてない

rules の例

- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - get

[""]はコアの API グループを示す・ resources は名前空間。 verbs が API の種類

  • ClusterRole
    • Role : ある namespace で権限を設定する
    • ClusterRole : NameSpace に属さないリソース
    • nginx-ingress
    • ingress-nginx-admission
  • RoleBinding
    • バインドする設定
  • ConfigMap
  • Service
    • ingress-nginx-controller : アノテーションで設定を記載
    • ingress-nginx-controller-admission
  • Deployment : Pod と ReplicaSet のアップデート機能を提供 : アップデートの仕組みを提供するためのグループとかそういうの。Deployment 単位で B/G デプロイとかが可能
  • Job : Jobは一つ以上のPodを作成し、指定された数のPodが正常に終了するまで、Podの実行を再試行し続ける
  • IngressClass
    • 特定の Ingress Controller を Ingress に関連づけるためのもの.
    • Kubernetes クラスター内の Ingress タイプを指定するために使用
  • ValidatingWebhookConfiguration
    • その名の通りリクエストを通していいかどうかのチェックのための設定
    • clientConfig がチェック内容
  clientConfig:
    service:
      name: ingress-nginx-controller-admission
      namespace: ingress-nginx
      path: /networking/v1/ingresses

すべての service.beta.kubernetes.io アノテーションを以下に置き換えます。

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: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "instance"
service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"

デプロイ

kubectl apply -f deploy.yaml
no nodes available to schedule pods
kubectl get nodes
No resources found

確かにない

kubectl get events
LAST SEEN   TYPE      REASON             OBJECT                               MESSAGE
3m11s       Warning   FailedScheduling   pod/frontend-f7d9c57d4-66kpf         no nodes available to schedule pods
3m11s       Warning   FailedScheduling   pod/frontend-f7d9c57d4-kt2gc         no nodes available to schedule pods
3m11s       Warning   FailedScheduling   pod/frontend-f7d9c57d4-vgr9s         no nodes available to schedule pods
3m11s       Warning   FailedScheduling   pod/redis-master-857d99cc8-t8q7c     no nodes available to schedule pods
3m11s       Warning   FailedScheduling   pod/redis-replica-566d4f87dc-m4bx2   no nodes available to schedule pods
3m11s       Warning   FailedScheduling   pod/redis-replica-566d4f87dc-p8nq7   no nodes available to schedule pods
eksctl get nodegroups --cluster test
CLUSTER	NODEGROUP	STATUS		CREATED			MIN SIZE	MAX SIZE	DESIRED CAPACITY	INSTANCE TYPE	IMAGE ID	ASG NAME	TYPE
test	test		CREATING	2022-12-29T17:40:15Z	2		2		2			t3.medium	AL2_x86_64			managed
test	test-role	CREATING	2022-12-29T17:45:07Z	2		2		2			t3.medium	AL2_x86_64			managed

あ〜、eksctl で create してないと一部しかコマンド使えない https://eksctl.io/usage/unowned-clusters/

eksctl get cluster --name test
NAME	VERSION	STATUS	CREATED			VPC			SUBNETS										SECURITYGROUPS		PROVIDER
test	1.24	ACTIVE	2022-12-29T03:30:06Z	vpc-0d809879c178a4b0a	subnet-066b742eb83b445be,subnet-0939c5e5328791a0c,subnet-0e61cc31aa55151be	sg-0f9e3910323937b46	EKS

一応、ファイルからやればノード登録は可能らしい

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: test
  region: ap-northeast-1

vpc:
  id: "vpc-0d809879c178a4b0a"
  securityGroup: "sg-0f9e3910323937b46"    # this is the ControlPlaneSecurityGroup
  subnets:
    private:
      private1:
          id: "subnet-066b742eb83b445be"
      private2:
          id: "subnet-0939c5e5328791a0c"
      private3:
          id: "subnet-0e61cc31aa55151be"


managedNodeGroups:
  - name: eks-ng-blue
    instanceType: t2.small
    desiredCapacity: 2
    minSize: 1
    maxSize: 3
    privateNetworking: true
    ssh:
      publicKeyName: rsa_com_key
      allow: true
    labels: {role: worker}
    tags:
      nodegroup-role: worker
eksctl create nodegroup -f node.yaml
2022-12-30 03:36:30 [ℹ]  will use version 1.24 for new nodegroup(s) based on control plane version
2022-12-30 03:36:31 [!]  no eksctl-managed CloudFormation stacks found for "test", will attempt to create nodegroup(s) on non eksctl-managed cluster
2022-12-30 03:36:34 [ℹ]  nodegroup "eks-ng-blue" will use "" [AmazonLinux2/1.24]
2022-12-30 03:36:34 [ℹ]  using EC2 key pair "rsa_com_key"
2022-12-30 03:36:34 [ℹ]  2 existing nodegroup(s) (test,test-role) will be excluded
2022-12-30 03:36:34 [ℹ]  1 nodegroup (eks-ng-blue) was included (based on the include/exclude rules)
2022-12-30 03:36:34 [ℹ]  will create a CloudFormation stack for each of 1 managed nodegroups in cluster "test"
2022-12-30 03:36:34 [ℹ]  1 task: { 1 task: { 1 task: { create managed nodegroup "eks-ng-blue" } } }
2022-12-30 03:36:34 [ℹ]  building managed nodegroup stack "eksctl-test-nodegroup-eks-ng-blue"
2022-12-30 03:36:34 [ℹ]  deploying stack "eksctl-test-nodegroup-eks-ng-blue"
2022-12-30 03:36:34 [ℹ]  waiting for CloudFormation stack "eksctl-test-nodegroup-eks-ng-blue"

Fargate Profile : どの Pod が Fargate を使うかを決めるもの

eksctl create fargateprofile

eksctl create fargateprofile \
    --cluster test \
    --name my-fargate-profile \
    --namespace test \
    --labels key=value

以下が制約っぽい?

    --namespace my-kubernetes-namespace \
    --labels key=value

Node :

https://kubernetes.io/ja/docs/concepts/architecture/nodes/

  • コンテナを配置する Pod を実行するための物理マシン or VM
  • 1ノード中には kubelet、コンテナランタイム、kube-proxy が最低限含まれる(他ノードとの通信用)
  • 登録方法は2type
    • すでに稼働しているノード自身から kubelet で所属する(kubelet で register コマンドがある)
    • ノードを作成して登録する
  • 基本は Pod がノード上に配置される。配置されないようにするには Cordon を行う cordon = schedule 不可のマークをつけること

EKS の設定確認

https://kubernetes.io/docs/reference/kubectl/cheatsheet/

kubectl config view

# cat .kube/config からほとんど同じ情報を持ってくる
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://497C2C8D101DA10B0B6BBA1304551ABE.gr7.ap-northeast-1.eks.amazonaws.com
  name: arn:aws:eks:ap-northeast-1:hogehoge:cluster/test

kube-system 名前空間のものを確認

kubectl get pods --all-namespaces
NAMESPACE       NAME                                        READY   STATUS    RESTARTS   AGE
default         frontend-f7d9c57d4-66kpf                    0/1     Pending   0          9h
default         frontend-f7d9c57d4-kt2gc                    0/1     Pending   0          9h
default         frontend-f7d9c57d4-vgr9s                    0/1     Pending   0          9h
default         redis-master-857d99cc8-t8q7c                0/1     Pending   0          9h
default         redis-replica-566d4f87dc-m4bx2              0/1     Pending   0          9h
default         redis-replica-566d4f87dc-p8nq7              0/1     Pending   0          9h
ingress-nginx   ingress-nginx-admission-create-4bk9v        0/1     Pending   0          47m
ingress-nginx   ingress-nginx-admission-patch-lvc7x         0/1     Pending   0          47m
ingress-nginx   ingress-nginx-controller-6f7bd4bcfb-w89gs   0/1     Pending   0          47m
kube-system     coredns-5fc8d4cdcf-l9p9v                    0/1     Pending   0          14h
kube-system     coredns-5fc8d4cdcf-n2gpk                    0/1     Pending   0          14h
kubectl get namespace
NAME              STATUS   AGE
default           Active   14h
ingress-nginx     Active   52m
kube-node-lease   Active   14h
kube-public       Active   14h
kube-system       Active   14h

kubectl get pods --namespace=kube-system
NAME                       READY   STATUS    RESTARTS   AGE
coredns-5fc8d4cdcf-l9p9v   0/1     Pending   0          14h
coredns-5fc8d4cdcf-n2gpk   0/1     Pending   0          14h

# おそらくデプロイ時に指定したもの?
kubectl get pod coredns-5fc8d4cdcf-n2gpk -o yaml --namespace=kube-system

coredns 設定確認

  • Podをデプロイしている
  • Node Affinity : デプロイしたいPod を、適当な Node ではなくて、特定の Node 集合へスケジュールするための仕組み。今回だと、EKS のサービス側コアノードにデプロイしたい? それとも全ノードへインストールする感じ?それともコア側は無視する? Ignore だから除外条件を指定しているっぽい
  • その下にコンテナイメージ設定とポートバインディング設定がある
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/os
            operator: In
            values:
            - linux
          - key: kubernetes.io/arch
            operator: In
            values:
            - amd64
            - arm64
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: k8s-app
              operator: In
              values:
              - kube-dns
          topologyKey: kubernetes.io/hostname
        weight: 100

https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html k8s の NG 作成時にタグ指定しつつ、SG も追加