Kubernetes
https://gyazo.com/548b299298a1f614c43faa61a27394e1
管理や検出を容易にするため、アプリケーションを論理的な単位に分割し、コンテナをグルーピングします。KubernetesはGoogleでの15年にわたる経験を基に構築されており、コミュニティのアイディアや慣習との最善の組み合わせを取っています。 ディストリビューション
https://www.cncf.io/wp-content/uploads/2020/07/certified_kubernetes_color-1.png
Tool
ローカル開発環境やオンプレミス環境で構築する
table: distribution
distribution memory
Managed
クラウドサービスで提供されているものを使用する
コントロールプレーン側をクラウドプロバイダーが管理する
Kubernetes API
KubernetesのAPIは、Kubernetesの機能をRESTfulインターフェースで提供し、クラスタの状態を保存するアプリケーションです。
Kubernetesのリソースや「意図の記録」はすべてAPIオブジェクトとして保存され、APIへのRESTfulな呼び出しを通じて変更される。このAPIにより、設定を宣言的な方法で管理することができます。ユーザーはKubernetes APIと直接、またはkubectlのようなツールを介して対話することができます。KubernetesのコアAPIは柔軟性があり、カスタムリソースをサポートするために拡張することも可能です。 kubectl では context を参照して kubernetes に接続する
Cluster
User
Server-side apply
kubectl set コマンド
コンフリクトを検知する
metadata.managedFields
--server-side --force-conflicts
kubectl api-resources コマンドで確認する
Workload Resources
Pod
Kubernetesにデプロイできるコンテナ最小単位
複数のコンテナをデプロイできる
通常は Controller(Deployment,DaemonSet,StatefulSet)で作成されるため、直接マニフェストでは定義しない
ストレージとネットワークの共有
共有しなければならないものをサイドカーとしてデプロイ
StaticPod
API サーバーが監視せず、特定のノード上の kubelet デーモンによって直接管理される Pod
kubelet config に path が書かれている
/var/lib/kubelet/config.yaml
パス例
/etc/kubernetes/manifests
自動的に作成される。更新には Pod 削除が必要
initContainer
imagePullPolicy
imagePullPolicy: Always
latest タグは Pod 起動時のみ Pull する
imagePullPolicy: IfNotPresent
imagePullPolicy: Never
securityContext
readOnlyRootFilesystem: true が推奨されている
書き込みが必要なディレクトリを把握して、volume をマウントする
scheduleName
nodeName
default では設定されていない
scheduler が自動的に生成するフィールド
scheduler が不在の時は手動で指定ことができる
nodeSelector
key: value: label を指定する。
affinity
containers
command
ENTRYPOINT を上書きする
args
CMD を上書きする
resources
requests/limits を設定する
requests(要求): 下限
limits(制限): 上限
こちらのみ設定した場合は、自動的に同様の値で requests が設定される
cpu
1vCPU 単位で絶対量でカウントされる
細かい設定が可能なため 100m(0.1)形式が推奨されている
memory
hugepages-<size>
ephemeral-storage
volume を除いたデータ量
tmpf semptyDir ボリュームを除く emptyDir ボリューム
Node レベルのログを保持するディレクトリ
書き込み可能なコンテナレイヤー
limit を超えると Pod が自動的に Evict される
複数コンテナの場合はいずれかの大きい方が適用される
container の合計
initContainer
Probe
ReadinessProbe
LivenessProbe
StartupProbe
volumes
persistentVolumeClaim
configMap
secret
downwardAPI
emptyDir
hostPath
nfs
パーミッションについて
yaml に記載する場合は zero fill した 4 桁 の 8 進数(0755 )で記述する。
kubectl get で確認した時に 10 進数表記の場合がある。
(制約により)JSON ファイルの場合は 10 進数で記述する。
defaultMode
mode
ReplicaSet
指定したPodを複製する
ReplicaSet 更新時は Pod 再作成されない
kubectl rollout は dp,ds,sts に対応している
Deployment
PodのRolling Updateをする
ReplicaSetを管理する
このManifestがあればデプロイができる
アップデート戦略
spec.strategy.type で指定
Recreate
Pod の数を 0 にして再作成
ダウンタイムが発生する
RollingUpdate
maxUnavailable
maxSurge
パーセンテージでの指定も可能
デフォルトはそれぞれ 25% となる
分散
topologySpreadConstraints
Node が持つラベルの値が異なることを利用して、Pod を分散配置する仕組み
Region
Zone
Node
spec.template.spec.topologySpreadConstraints で指定
topologyKey
labelSelector
maxSkew
差を制限する
whenUnsatisfiable
DoNotSchedule: スケジューリングしない
ScheduleAnyway: 他の条件が緩いノードにスケジュールする
kube-scheduler により実行される
デプロイ後のものは対象にならない
PDB
StatefulSet
ステートフルなコンテナを起動する
冗長化はアプリケーションで行うと良さそう
0: master
1: slave
DaemonSet
全てのノードに 1Pod をデプロイする
Deployment yaml から生成すると楽
Job
1つ以上のPodを作成し、正常終了したことを保証する
CronJob
Job を定期実行
HorizontalPodAutoscaler
スケールダウンのデフォルトの時間枠は 5 分
Service Resources
Service
Podへの接続を解決する
外部から接続ができる
Config and Storage Resources
ConfigMap
アプリケーション設定を分離するために使用する
Secret
Secret Management
PersistentVolumeClaim
PersistentVolume
StorageClass
Authentication Resources
ServiceAccount
Bound Service Account Token
Authorization Resources
Policy Resources
LimitRange
ResourceQuota
NetworkPolicy
ネットワークレイヤーでトラフィックフローを制御する
Reference
PodDisruptionBudget
pdb
Pod を停止できる数を制限する
指定方法
replica 数
パーセンテージ
ALLOWED-DISRUPTIONS が現在停止が許容されている Pod 数
0 の場合は drain しても Evict や drain されずに指定の値で timeout する
Extend Resources
CustomResourceDefinition
Admission Webhook
Mutating
Validating
Cluster Resources
Node
Namespace
デフォルトで作成されているもの
kube-system
kube-public
kube-node-lease
default
Architecture
Deployment, Replicaset の状態を監視する
1 つのバイナリによって動作する
コンテナランタイム
クラスタDNS
Ops
node
cordon -> drain
Annotation
システムが使用するメタデータ
prefix/key: value
数値の場合はダブルクウォートで囲う
Label
リソース管理に使用するメタデータ
table: 作成時に付与されるラベル
app アプリケーションの名前 create コマンドで作成された
run アプリケーションの名前 run コマンドで作成された
table: 推奨されるラベル
app.kubernetes.io/name アプリケーションの名前
app.kubernetes.io/version アプリケーションのバージョン
app.kubernetes.io/component アプリケーションの役割
app.kubernetes.io/part-of アプリケーションが全体として構成するシステムの名前
app.kubernetes.io/instance アプリケーションやシステムを識別するインスタンス名
app.kubernetes.io/managed-by アプリケーションが管理されているツール Helm, kubernetes
Concepts
networking
Security
Pod Security Admission
Pod の動作を制限する仕組み
Samples
alias
code: (bash)
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
alias k=kubectl
complete -o default -F __start_kubectl k
export do="--dry-run=client -o yaml"
apply
code: (bash)
delete
code: (bash)
code:whoami-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: whoami
labels:
app: whoami
spec:
selector:
app: whoami
type: NodePort
# type: LoadBalancer
externalTrafficPolicy: Local
ports:
- protocol: TCP
port: 80
targetPort: 8000
code:whoami-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
spec:
selector:
matchLabels:
app: whoami
replicas: 2
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: jwilder/whoami
ports:
- containerPort: 8000
code:whoami-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-stg
spec:
tls:
- hosts:
- cluster.yumenomatayume.home
rules:
- host: cluster.yumenomatayume.home
http:
paths:
- path: /whoami
pathType: Prefix
backend:
service:
name: whoami
port:
number: 80
Learning
Reference
Memo
Pod が Evicted される原因
Node リソースが足りない