Open27

Kubernetesについて色々学ぶ

tomokitomoki

Service

*kubectl expose deployment go-app --type=LoadBalancer --port 80 --target-port 8080とするとselectorがapp=go-appとなる。selectorがないとバックエンドに通信できなくなる。

セレクターなしのService

このServiceはセレクターがないため、対応するEndpointsオブジェクトは自動的に作成されません。 ユーザーはEndpointsオブジェクトを手動で追加することにより、向き先のネットワークアドレスとポートを手動でマッピングできます。

種類

  • type=ClusterIPの場合はServiceをKubernetesクラスター内部のIPで公開します。
    このタイプではServiceはクラスター内部からのみアクセスでき、外部からのアクセスはできません。

  • type=NodePortの場合は、各Node VMのIPを使ってServiceを公開します。
    Node VMのIPを使うので、クラスター内部からだけでなくそのVMにアクセスできる外部のアプリからもアクセスすることができます。

https://zenn.dev/smiyoshi/articles/c86fc3532b4f8a

https://kubernetes.io/ja/docs/concepts/services-networking/service/

tomokitomoki

Namespace

Namespaceは、複数のユーザーの間でクラスターリソースを分割する方法です。

デフォルトではクラスタ内であればnamespace越しの通信が許可されています。もし、これを許容できない要件があれば、NetworkPolicyを利用することで制限できます。ただし、NetworkPolicyが利用できるのはコンピューティングタイプがEC2の場合のみで、Fargateを利用する場合はこれを利用できません。

https://techblog.zozo.com/entry/zozoglass-eks-multi-tenancy

https://qiita.com/walk8243/items/604aac748daeee9d8c05

https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/namespaces/

tomokitomoki

Job

Jobとは、1つ以上のPodを作成し、指定された数のPodの処理が成功するまで動き続けるオブジェクトです。

https://kubernetes.io/docs/concepts/workloads/controllers/job/

CronJob

CronJobとは、スケジュールに基づきJobを作成するオブジェクトです。

https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/

restartPolicy: Never
Job失敗時は指定した回数分新規のPodが起動され、リトライを繰り返す。

restartPolicy: OnFailure
Job失敗時は指定した回数分同一のPodでリトライを繰り返す。


Alwaysであれば、kubeletは「podが常に動き続けている状態」を保証しようと振る舞うので、Deployment

OnFailureであれば、kubeletは「podに障害が発生した時や障害が発生した時に新しいpodを開始させる」ように振る舞うので、Job

Neverであれば、特にrestartする必要がないので通常のpodとなる

tomokitomoki

User Account

外部からユーザーが Kubernetes を操作するために使うユーザーアカウントです。ユーザーアカウントの認証はローカルに置かれている ~/.kube/config にある kubeconfig ファイルの中にあるクライアント証明書というものを用いて行います。

Service Account

  • K8s のリソースで、API サーバーにリクエストを出す時の認証/認可で使用される。Pod で直接 K8s のリソースを操作する時などに使用する

  • Podと紐づけることでPodからKubernetesAPIを操作できるようになります。Namespaceに紐づくリソースには全てServiceAccountが紐づきます。

*ServiceAccountはそれだけではリソースに対する操作を行う権限を持ちません。RBACではどんなユーザー(ServiceAccount)か、ではなくユーザーがどんなロールを持っているかで権限が決まります。kubernetesにはロールに関わるリソースは Role・ClusterRole・RoleBinding・ClusterRoleBinding
の4つがあります。

https://hyoublog.com/2022/05/02/kubernetes-serviceaccount/#toc1

https://knowledge.sakura.ad.jp/21129/

https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/

tomokitomoki

Role・ClusterRole

RoleとClusterRoleの違いはNamespaceで分離されているかどうか。 RoleはNamespaceで分離されている。 ClusterRoleはNamespaceで分離されておらず、クラスター全体から参照できる。
権限は追加方式であり、拒否する権限はありません

RoleBinding・ClusterRoleBinding

RoleBindingとClusterRoleBindingはどのRole/ClusterRoleをどのServiceAcctountに紐付ける。

https://qiita.com/tkusumi/items/300c566a74b6b64e7e89#non-resource-urlへの操作

https://cstoku.dev/posts/2018/k8sdojo-20/

https://qiita.com/sheepland/items/67a5bb9b19d8686f389d

https://dev.classmethod.jp/articles/eks-cluster-access-control/

https://dev.classmethod.jp/articles/eks-supports-iam-roles-for-service-accounts/

https://kubernetes.io/ja/docs/reference/access-authn-authz/rbac/

aws-auth, irsa

https://zenn.dev/nameless_gyoza/articles/eks-authentication-authorization-20210211

tomokitomoki

port-forward

Deployment・Serviceに紐づくPodへのポートフォワーディング。もちろん特定のPodを指定して行うことも可能。

kubectl port-forward deployment/sample-deployment 8888:80
tomokitomoki

ExternalName

セレクターなしのServiceへのアクセスは、セレクターをもっているServiceと同じようにふるまいます。上記の例では、トラフィックはYAMLファイル内で192.0.2.42:9376 (TCP)で定義された単一のエンドポイントにルーティングされます。

ExternalName Serviceはセレクターの代わりにDNS名を使用する特殊なケースのServiceです。さらなる情報は、このドキュメントの後で紹介するExternalNameを参照ください。

*Namespace間通信

https://8gwifi.org/docs/kube-externalname.jsp

https://www.mtioutput.com/entry/k8s-externalname-service

https://kubernetes.io/ja/docs/concepts/services-networking/service/

tomokitomoki

kubectlプロキシを使用する

以下でkubernetes APIにリクエストできるようになる。

kubectl proxy --port=8080
curl http://localhost:8080/api/
tomokitomoki

GET /api/v1/namespaces/{namespace}/pods/{name}/proxy/{path}

tomokitomoki

Probe

Liveness Probe

  • コンテナが生きているか確認する。コマンド, HTTP, TCPの3つの確認の仕方がある。

Readiness Probe

  • コンテナがトラフィックを受け入れられる状態であるか判断してくれる。HTTPとTCPの確認法。

Startup Probe

  • コンテナの起動のタイムアウトとして使える。300秒経過すると終了し、その後はPodのrestartPolicyに従う。

Probeの動き

Probeが失敗した時のみPodにエラーが出る。
エラーが出た場合 30 × 10
failureThreshold: 30periodSeconds: 10

 Startup Probe(タイムアウト) →
成功→ Liveness Probe(コンテナのヘルスチェック)
失敗→ restartPolicy

https://kubernetes.io/ja/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

https://qiita.com/jackchuka/items/5629b1172da6267645f3

https://zenn.dev/nekoshita/articles/4e838ae224ed56

tomokitomoki
  • kubernetesのネットワーク
  • custom controller