Kubernetes(k8s)について雑多なメモ

まだ整理しきれてない上に理解しきれていない部分も多い。人間には難しすぎる。
あとでもう少しきれいにまとめる。
一部機能はIKS(IBM Cloud Kubernetes Service)で確認している。
Node.jsのアプリをデプロイするところまではなんとかできた。




ローカルでk8sを試す



Macの場合はDocker for MacをインストールしてKubernetesにチェックを入れるだけで利用できるようになる。

https://tamanyan.net/deploy-node-app-to-kubernetes-in-10-mins/

上記まとまりが良すぎて何も書くことがない。

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
にアクセスしたときの認証情報は

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
最後のTokenをコピーすることで取得できる。



レジストリにプッシュしてk8sにアップロードするところまで



一通り実用できるところまでやる。

IBM Cloudへログインする


一応
https://www.ibm.com/cloud-computing/bluemix/ja/watson
からライトアカウントを作成して無料のクラスタを1つ作成できる。
今回はクラスタができたところからを想定。
Cloud Foundry CLIとIBM Cloud CLI(こっちだけでいいかも)も必要。

cf login -a https://api.ng.bluemix.net/ -o xxxxx.co.jp -s dev

ibmcloudから始まるIBMCloud固有のコマンドを使用するためログインが必要。
使用するサービスによって変わる。


コンテナレジストリにログインする


以下の手順はIBMCloudのコンテナレジストリサービスのダッシュボードから確認できる。

ibmcloud cr login

環境変数設定
シェルを起動するたび毎回必要

ibmcloud cs cluster-config
ibmcloud cs cluster-config mycluster

ibmcloud cs region-set us-south

以下のように表示されたコマンドを実行
export KUBECONFIG=/Users/$USER/.bluemix/plugins/container-service/clusters/mycluster/kube-config-hou02-mycluster.yml

シェルを立ち上げるたびにexport(環境変数の設定)が必要。

以降のkubectlコマンドはIKSに対する操作になる。


アプリケーションイメージをビルドする


ibmcloud cr build -t registry..bluemix.net//: .
ibmcloud cr build -t registry.ng.bluemix.net/yamada/hello-world:1 .
レジストリのネームスペースは事前に作成する
現在のディレクトリのDockerfileを元にビルドする。


以下は簡単なNode.jsをビルドするためのDockerfileサンプル.

FROM node:9.4.0-alpine
COPY dist /dist
COPY app.js .
COPY package.json .
RUN npm install &&\
apk update &&\
apk upgrade

EXPOSE 3000

CMD node app.js

実行環境はnode:9.4.0-alpine.
COPYで動作に必要なファイルをコピー。
RUNはスクリプト実行。
EXPOSEでポート番号に3000を指定している。
CMD node app.js でサーバ立ち上げ。

https://console.bluemix.net/containers-kubernetes/registry/main/private
あるいは
ibmcloud cr image-list
で確認できる。


レジストリからクラスタへデプロイ


kubectl run hello-world-deployment --image=registry.ng.bluemix.net/namespace/hello-world:1

ただし上記コマンドは非推奨なのでkubectl applyを使用する(設定をdeployment.yamlに記述する)

kubectl apply -f deployment.yaml
deployment.yaml

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: hello-world
  labels:
    app: hello-world
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: registry.ng.bluemix.net/namespace/hello-world:1
        command:
        ports:
          - containerPort: 3000

namespaceは事前にクラスタ上(mycluster)に作成する必要がある。
特に重要なのはimage, containerPortあたり。
imageはビルドイメージが存在するレジストリを指定する。
DockerHubやあるいは各社が提供しているレジストリサービスを利用する(だいたい統合されている)


ブラウザからアクセスできるようにNordPortサービスとして公開


以上で間違いがなければアプリケーションは動作しているがそのままだとどこからもアクセスできない。

kubectl expose deployment/ --type=NodePort --port=80 --name= --target-port=8080
kubectl expose deployment/searchi --type=NodePort --port=80 --name=searchi-service --target-port=3000

あるいは

kubectl apply -f service.yaml

service.yaml の例。

kind: Service
apiVersion: v1
metadata:
  name: searchi-service
spec:
  type: NodePort
  selector:
    app: searchi2_1540
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000


selector:appはdeployment.yamlのlabels:appあるいはkubectl get deployment -o wideのSELECTORから確認可能。
protocolはデフォルトTCP。
portはいまいち調べきれていない。
target-portはアプリケーションのポート番号。DockerfileのExpose, app.listenのポート番号、deployment.yamlのcontainerPortは統一する。

NodePortを確認


kubectl describe service hello-world-service
kubectl describe service searchi-service


Public IP を確認

ibmcloud ks workers
ibmcloud ks workers mycluster
Public IP:NodePort でアクセス
サービスによってIPアドレスの確認方法は変わる。ローカルならlocalhostでアクセス可能。

フリーだと毎月上げ直しが必要?


それぞれのポートの違い


ポートが多すぎてこんがらがってくる。

nodePort
サービスがアプリケーションを公開するときのポート
アプリケーションにアクセスするときに指定する。
指定も可能(このフィールドが指定されていない場合、Kubernetesは自動的にノードポートを割り当てる)。

port
公開サービスをクラスタ内で内部的に指定されたポート。
あまり意識することはないかもしれない。

targetPort
Pod上で動作するアプリケーションのポート。



コンテナ上のアプリケーションの更新




正しいやりかたではないかもしれない。

環境変数の設定


シェルを立ち上げる度に必要。環境によってコマンドは変わる。

export KUBECONFIG=/Users/$USER/.bluemix/plugins/container-service/clusters/mycluster/kube-config-hou02-mycluster.yml

指定したタグバージョンでビルド


ibmcloud cr build -t registry.ng.bluemix.net/yamada/searchi:x .

xは1上げたりするなど管理可能にする。
レジストリにどんどん溜まっていくので定期的に削除しないといけない。


デプロイメント作成


kubectl apply -f deployment.yaml --record

--recordで変更があれば更新する。



コマンド一覧




使用可能なクラスタ 表示
ibmcloud ks clusters

クラスタのワーカー表示
ibmcloud ks workers --cluster mycluster

ネームスペース一覧
ibmcloud cr namespace-list

ビルドイメージ確認
ibmcloud cr image-list

割当量確認
ibmcloud cr quota

サービス一覧取得
kubectl get svc

サービス削除
kubectl delete services

pod確認
kubectl get pods

Running: 稼働中
Pending: Pod起動待ち
ImageNotReady: dockerイメージ取得中
PullImageError: dockerイメージ取得失敗
CreatingContainer: Pod(コンテナ)起動中
Error: エラー

PullImageErrorになる場合Deployment.yamlのimageの指定が間違っている。

pod削除
kubectl delete pods {$pod_name} --grace-period=0 --force
kubectl delete pods {test-5fd7bb5b96-zxlp8} --grace-period=0 --force
レプリカコントローラ、セット、デプロイメントから作成された場合削除できない

レプリカコントローラ取得/削除
kubectl get rc
kubectl delete rc [rc名]

レプリカセット/削除
kubectl get rs
kubectl delete rs [rs名]

デプロイメント取得/削除
kubectl get deployment
kubectl delete deployment [deployment名]



エラー対応



The connection to the server localhost:6443 was refused - did you specify the right host or port
unable to recognize "deployment.yaml": Get https://localhost:6443/api?timeout=32s: dial tcp

環境変数の設定が必要





参考



参考の参考
https://medium.com/mixi-developers//新卒がプロダクトにk8s導入したとき参考にしたサイト達-5d5a5a042f50

コマンド一覧
https://qiita.com/MahoTakara/items/a6b50ac8fc7947122789

kubectlコマンド
https://qiita.com/suzukihi724/items/241f7241d297a2d4a55c

クラスタ 事始め
https://console.bluemix.net/containers-kubernetes/clusters/5ed44ae08f6e4ed4a334b4de5c66276e/access?region=ibm:yp:us-south&resourceGroup=

コンテナレジストリ 事始め IBM Cloud
https://console.bluemix.net/containers-kubernetes/registry/main/start

クラスタ 事始め IBM Cloud
https://console.bluemix.net/docs/containers/cs_clusters.html#clusters

k8sでアプリのアップロード IBM Cloud
https://console.bluemix.net/docs/containers/cs_tutorials_apps.html#cs_apps_tutorial

クラスタトラブルシューティング IBM Cloud
https://console.bluemix.net/docs/containers/cs_troubleshoot_clusters.html#cs_troubleshoot_clusters

k8sチュートリアル ローカルクラスタ
イメージを掴むのにとても良い。ただしMacのみ。
https://tamanyan.net/deploy-node-app-to-kubernetes-in-10-mins/


ここまでやってもまだまだ恩恵にはあずかれない。先は長い。

2019年2月14日木曜日