Kubernetes

update create

コンテナオーケストレーションツール。

構築 https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/


Ingressで外部にサービスを公開する。
通常はクラスタ内のみ。
Layer4まではNode Portで可能。

freshpodはデプロイされているコンテナイメージの更新を検知して、自動で再デプロイするツール。
kube-promptはCLI kubectlの保管ツール、macOS/linuxむけ。

HelmはKubernetes chartsを管理するツール。

ヘルスチェック
livenessProbe, readlinessProbeなど
コンテナ実行時に設定ができる

ロギング
DockerはFluentdなどのログコレクタを使用することが多い。

昔はアプリケーションがログをファイルに書き出すことが標準だったが、
Dockerではログを標準出力すればホスト側ファイル出力されます。
コンテナログのローテート

docker container run -it --rm -p 8080:8080 
 --log-opt max-size=1m  
 --log-opt max-file=5
hoge/hoge:latest

FluentdとElasticsearchでログとか KubernetesでElasticsearchとKibanaでログとか
Docker/Kuberetesでロギングの王道

  • 標準出力を前提
  • nginx等のミドルウェアのログも標準出力でイメージ構築する
  • 標準出力するログは全てJSON形式
  • fluent/fluentd-kubernetes-daemonsetで構成されるPodをDeamonSet各ホストに配置
  • Kubernetesのリソースにはラベルを適切に設定することでログの検索性を確保

Google Stackdriverなどもログ収集できる
GCP, AWSのロギングモニタリングサービス。

dockerdのチューニング
max-concurrent-downloadsなど

イメージのテスト
デスク容量の枯渇に注意 doker system prune -a が便利とか

Sample

// nginxコンテナ3つからなるグループを作成、myappラベルを付与
kubectl run myapp --image=nginx:1.12 --replicas 3 --labels="app=myapp"
// port 80で受けてmyappラベルのついたコンテナに流すバランサの作成
kubectl create service loadbalancer --tcp 80:80 myapp
// myappに外部からアクセスするためのIP Addressを取得
kubectl get service myapp
sudo apt-get update && sudo apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
# https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

p45

GA: General availability

Shell

podで実行されているユーザでシェルを使用

kubectl exec --stdin --tty [pod name] -n [name space] -- /bin/bash

特権ユーザで使用したい場合(docker runtime)

  • Container ID: docker://[container id] を取得
kubectl describe pod [pod name] -n [name space]
  • Containerが実行されているNodeにログインし、docker経由でシェルにアタッチ。
docker exec -it -u root [container id] /bin/bash

containerd移行

docker コマンドは使えなくなる
nerdctl --namespace=k8s.io で代用する