Help us understand the problem. What is going on with this article?

Kubernetes の小技 2016

More than 1 year has passed since last update.

この記事は、「Kubernetes Advent Calendar 2016」11日目の記事です。9日目の「k8sが導入するService Brokerの仕組みとは」で紹介されている service-catalog には非常に注目しており、とても楽しく読むことができました :blush:

ここでは、これまで Kubernetes を使ってきて貯まった小技を共有します。

  1. kubectl のサブコマンドやオプションを補完する
  2. kubectl の context や namespace を環境変数によって指定する
  3. 指定しているコンテキストやネームスペースをプロンプトに表示する (zsh)
  4. クラスタで有効な API バージョンを取得する
  5. クラスタで有効なリソースタイプを取得する

kubectl のサブコマンドやオプションを補完する

.zshrc
source <(kubectl completion zsh)

kubectl のサブコマンドやオプションが補完されるようになります。kubectl get などオプションに作成されているリソース名をとる場合でも補完されるようになっているので、積極的に使いたいです。bash と zsh に対応しています。

kubectl の context や namespace を環境変数によって指定する

kubectl.zsh
function kubectl() {
    command kubectl \
        --context="$KUBECTL_CONTEXT" \
        --namespace="$KUBECTL_NAMESPACE" \
        --user="$KUBECTL_USER" \
        --server="$KUBECTL_SERVER" \
        "$@"
}

kubectl のアクセス先のサーバやネームスペース、ユーザ、それらの組み合わせであるコンテキストは kubeconfig ファイルを使い指定しますが、一時的に設定を切り替えたいときには kubectl に用意されている --context, --namespace などのオプションを使うことができます。ただこれらのオプションは都度指定する必要があるため手間です。
上記の関数を使うことで、それぞれのオプションを環境変数によって指定することができるようになります。環境変数であれば設定されている間有効になるため、都度オプションで指定するような手間がありません。

current context と namespace をプロンプトに表示する (zsh)

image

複数の Kubernetes クラスタを操作していると、現在どのコンテキストやネームスペースが指定されているのか分からなくなり混乱することがあります。
上記のスクリプトを使うことで現在のコンテキストやクラスタ/ネームスペースなどをプロンプトに常に表示しておくことができます。詳しい使い方は README.md を参照してください。

クラスタで有効な API バージョンを取得する

$ kubectl api-versions

接続先のクラスタで有効な API バージョンを取得するには上記のコマンドを使います。
kube-apiserver を --runtime-config=api/all=true で起動させ、上記コマンドを実行することで、そのバージョンのクラスタで利用できる全ての API バージョンを知ることができ、kube-apiserver の --runtime-config を設定するのにも役立ちますし、最近は ThirdPartyResources が活発に利用され始めているため、それによって追加された API バージョンを調べることにも使えます。

クラスタで有効なリソースタイプを取得する

ETA 18/2/20: kubectl proxy を使わないように変更しました。

$ kubectl api-versions | sed -e 's|^|apis/|g' | sed -e 's|apis/v1|api/v1|g' | xargs -P3 -I{} bash -c "kubectl get --raw {} | jq -r 'select(.resources !=null).resources[].name'" | grep -v '/' | sort | uniq
apiservices
bindings
certificatesigningrequests
clusterrolebindings
clusterroles
componentstatuses
configmaps
controllerrevisions
cronjobs
customresourcedefinitions
...

API バージョンを取得するの応用で、クラスタで有効なリソースタイプを取得するには、上記のワンライナーが使えます。ABAC, RBAC など認可の設定をするときに便利です。またサブリソースも取得したいときは下記のワンライナーを使ってください。

$ kubectl api-versions | sed -e 's|^|apis/|g' | sed -e 's|apis/v1|api/v1|g' | xargs -P3 -I{} bash -c "kubectl get --raw {} | jq -r 'select(.resources !=null).resources[].name'" | sort | uniq
apiservices
apiservices/status
bindings
certificatesigningrequests
certificatesigningrequests/approval
certificatesigningrequests/status
clusterrolebindings
clusterroles
componentstatuses
configmaps
controllerrevisions
cronjobs
...

これらのワンライナーは jq コマンドを利用しています。必要に応じてインストールしてください。

まとめ

Kubernetes クラスタを使う側とクラスタを設定する側それぞれで便利な小技を紹介しました。来年はもうちょっとしっかりしたエントリでアドベントカレンダに臨むようにします :sweat_smile:

superbrothers
Working at Preferred Networks, Inc / CNCF Ambassador / 『Kubernetes実践入門』『 みんなのDocker/Kubernetes』共著 / 『入門Prometheus』監訳 / Kubernetes Meetup Tokyo co-organizer / Cloud Native Deep Dive co-organizer
https://text.superbrothers.dev/
pfn
Make the real world computable / 現実世界を計算可能にする
https://preferred.jp/ja/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした