Kubernetesメモ

#クラスタとNode
##クラスタに参加しているNode一覧を取得
```docker:
kubectl get nodes
```

##Nodeの使用状況を確認する
```docker:
kubectl describe nodes
```


#Namespace
クラスタの中にさらにクラスタを作成する。
1つのクラスタで複数チームで開発する時などに使用するらしい。
https://thinkit.co.jp/article/13542

##Namespace一覧を取得する
```docker:
kubectl get namespace
```

#Pod
コンテナ集合体の単位で、最低1つのコンテナを持つ。
Kubernetesでは、（コンテナが1つの場合でも）Pod単位でデプロイする。

##Podをデプロイする
```docker:
kubectl apply -f マニフェストファイル
#-f マニフェストファイルのパスを指定
#マニフェストファイルとはKubernetesの各種リソースを定義するファイル
```

##Podの一覧を取得する
```docker:
kubectl get pod
```

##Pod内のコンテナに入る
```docker:
kubectl exec -it Pod名 sh -c コンテナ名
```

##Pod内のコンテナの標準出力を出す
```docker:
kubectl logs -f Pod名 -c コンテナ名
```

##Podを削除する
```docker:
kubectl delete pod Pod名
マニフェストファイルベースで削除する
kubectl delete -f マニフェストファイル
```

##Pod詳細を確認する
Podが立ち上がらないときに状態を確認する

```docker:
kubectl describe pod <pod-name>
```

##マニフェストファイル
[参考](https://cstoku.io/posts/2018/k8sdojo-03/)
ネット見てたり、[Kubernetes APIリファレンス](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/#pod-v1-core)見てたりすると何となくわかってくる（ような気がする）
そもそもYAMLの書式よくわからない場合は、[こちら](https://magazine.rubyist.net/articles/0009/0009-YAML.html#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E6%9B%B8%E3%81%8D%E6%96%B9)参照

###apiVersion
apiVersion はオブジェクトのSchemaのVersionを指定する。

###kind
kind は作成するObject名を指定する。
Podを作成するために Pod を指定。

###metadata
ObjectのMetadataを指定する。

###spec
spec はオブジェクトの期待する状態を定義する。要はこのフィールドが具体的な設定を指定する場所。

###



#ReplicaSet
同じ仕様のPodを複数生成、管理する。
yamlファイルのkindをReplicaSetにする。

#GKE
##クラスタの作成（GKE）
なるべく安くpreemptibleなf1-microインスタンスで立ち上げる

```docker:
gcloud container clusters create <クラスタ名> --preemptible --machine-type=f1-micro --num-nodes=3 --disk-size=10 --zone=<ゾーン名>
```

##kubectlへの認証情報の設定
```docker:
gcloud container clusters get-credentials クラスタ名 --zone=ゾーン
```

##dockerイメージをタグ付けしてビルド
```docker:
# Container Registryの格納先をタグにしてDockerイメージをビルドする
# タグの形式は、asia.gcr.io/[GCP_PROJECT_ID]/[IMAGE_NAME]:[TAG]
docker image build -t asia.gcr.io/GCP_PROJECT/test:1.0 .
```

##Container Registryへのpush
```docker:
#GCP_PROJECTはプロジェクト名ではなくプロジェクトID
gcloud auth configure-docker
docker -- push asia.gcr.io/GCP_PROJECT/test:1.0
```

##Container Registryのイメージ一覧
```docker:
gcloud container images list --repository=[HOSTNAME]/[PROJECT-ID]
#[HOSTNAME]はasia.gcr.io等
```

##データ永続化
GKEでは、VolumeClaimのyamlをアプライするとGCEの永続ディスクも作られる

```docker:サンプル.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: volumeclaim-airflow
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
```

```docker:PersistentVolumeClaim一覧を確認
kubectl get pvc
```

##個人的ハマりポイント
###gcloud dockerサポート切れ
gcloud docker は Docker 18.03 以降をサポートしないらしいので、
dockerクライアントが18.03以降で、gcloud docker使ってコンテナレジストリにアップしていると、pod作るときのイメージのpullでエラーになってしまう
その時は、gcloud auth configure-dockerして、docker -- push 〜でアップし直す。

###pod立ち上がらない
[参考](https://stackoverflow.com/questions/44702715/kubernetes-pod-fails-with-crashloopbackoff)
describe podしてもよくわからないときは、podのyamlファイルにcommand追加してみる

###立ち上げたpodにkubectl execでアクセスしようとするとフリーズする
クラスタのスペックが足りない可能性が高いので、オートスケールをONにするか、
ノードスペックを上げたクラスタを立ち上げる

###Cloud Build使用時のエラー
ResponseError: code=403, message=EXTERNAL: Required "container.clusters.get" permission(s) for ~
が出るときは、CloudBuildのサービスアカウントにGKEの管理者の権限を追加する

###ingress作成時のヘルスチェック
[参考](https://github.com/gcpug/nouhau/issues/43)
ヘルスチェックしにいくページのステータスが200で返ってこないとヘルスチェックがエラーになる。
Airflowでユーザー認証設定してる場合は、リダイレクトが発生するのでヘルスチェックは「/」のままだとエラーになるので、[こちら](https://qiita.com/nirasan/items/24858dfa03883cd4aa79)参考にヘルスチェック先を変更する。
どの時点でステータス200になるかは、[こちら](https://singoro.net/http-status-code/)で、serviceをLoadBalancerタイプにして確認しておく。


#その他
##コンテキスト
接続に使用する情報のこと

```docker:コンテキスト情報の表示
kubectl config get-contexts
```

```docker:コンテキスト情報の削除
kubectl config delete-context クラスタ名
```