0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

kubernetes the hard way on PC(7.k8sConfig)

Last updated at Posted at 2020-07-26

#初めに
kubernetes the hard way を PC でやってみる」の7回目、「Generating Kubernetes Configuration Files for Authentication」についてです。( 目次
ここもやればできるがわからない、という部分だと思いますので、ここもすこし丁寧にやりたいです。

下記の一連の手順は、 前回作成した各種証明書等を設定ファイルに組み込み、API Server 等と連携する際に利用できるようにします。

この記事では、 「Generating Kubernetes Configuration Files for Authentication」 部分について記載します。
設定ファイルの作成対象は以下の通りです。

  • Configuration ファイル作成
    • worker ノード (kubelet) 用
    • kube-proxy 用
    • kube-controller-manager 用
    • kube-scheduler 用
    • admin ユーザー用
  • Configuration ファイル配布

#Configuration ファイル作成

Configuration ファイルには、 Cluster, Context, Credentials(User) が設定されており、
Context を選択することにより、複数のクラスター環境をつど選択することができます。
(Cert は証明書, Key は秘密鍵のデータです)

43.png

kubectl コマンドを打つ際に --config で指定するか、 kubectl config use-context xxx で指定することにより
kubectl から接続する cluster を選択することができます。

44.png

これらは、 kubectl コマンドを利用する際だけではなく、 
kubernetes の各種コンポーネントが API server などと通信するときにも利用されます。
ここでは、「初めに」に記載した各種コンポーネント用の Configuration ファイルを作成します。
作業場所ですが、 各種証明書やキーファイルのあるディレクトリで実施します。
(別の場所で実施する場合は、各コマンド中の証明書やキーをフルパス指定します)

  • worker ノード (kubelet) 用

3台の worker ノードの kubelet 用に、ループを回しながら設定ファイルを生成しています。
最初に KUBERNETES_PUBLIC_ADDRESS 変数に k8sapi を指定しています。
これは kubernetes the hard way にはなく、今回独自です。
「第3回.VM作成」の hosts 設定 のところで、 k8smaster0 の IP に k8sapi という名前も付けていました。
これにより、 API サーバーは k8smaster0 上のものが使われます。 
今回は実施しませんが、 外部 Load Balancer 等で API サーバーを負荷分散する際に、
代表IP を k8sapi と名前解決させれば API サーバーの負荷分散が可能になります。

# export KUBERNETES_PUBLIC_ADDRESS=k8sapi

# for instance in k8sworker0 k8sworker1 k8sworker2
> do
>   kubectl config set-cluster kubernetes-the-hard-way \
>     --certificate-authority=ca.pem \
>     --embed-certs=true \
>     --server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443 \
>     --kubeconfig=${instance}.kubeconfig
>
>   kubectl config set-credentials system:node:${instance} \
>     --client-certificate=${instance}.pem \
>     --client-key=${instance}-key.pem \
>     --embed-certs=true \
>     --kubeconfig=${instance}.kubeconfig
>
>   kubectl config set-context default \
>     --cluster=kubernetes-the-hard-way \
>     --user=system:node:${instance} \
>     --kubeconfig=${instance}.kubeconfig
>
>   kubectl config use-context default --kubeconfig=${instance}.kubeconfig
>
> done

Cluster "kubernetes-the-hard-way" set.
User "system:node:k8sworker0" set.
Context "default" created.
Switched to context "default".

Cluster "kubernetes-the-hard-way" set.
User "system:node:k8sworker1" set.
Context "default" created.
Switched to context "default".

Cluster "kubernetes-the-hard-way" set.
User "system:node:k8sworker2" set.
Context "default" created.
Switched to context "default".
root@k8smaster0:/data/assam/k8s/ca#

作成されたファイルは以下のようになっています。
server 部分が https://k8sapi:6443 になっているのがわかります。
また、ノード用の kubeconfig なので、 user 部分は system:node:ノード名 となっています。
証明書や秘密鍵は各ノード用のものが設定されています。

# cat k8sworker0.kubeconfig
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUd... (略)
    server: https://k8sapi:6443
  name: kubernetes-the-hard-way
contexts:
- context:
    cluster: kubernetes-the-hard-way
    user: system:node:k8sworker0
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: system:node:k8sworker0
  user:
    client-certificate-data: LS0tLS1CR... (略)
    client-key-data: LS0tLS1CRUd... (略)

以後は各種コンポーネント向けに繰り返しになります。

  • kube-proxy 用
# export KUBERNETES_PUBLIC_ADDRESS=k8sapi
# kubectl config set-cluster kubernetes-the-hard-way \
>     --certificate-authority=ca.pem \
>     --embed-certs=true \
>     --server=https://${KUBERNETES_PUBLIC_ADDRESS}:6443 \
>     --kubeconfig=kube-proxy.kubeconfig
Cluster "kubernetes-the-hard-way" set.
# kubectl config set-credentials system:kube-proxy \
>     --client-certificate=kube-proxy.pem \
>     --client-key=kube-proxy-key.pem \
>     --embed-certs=true \
>     --kubeconfig=kube-proxy.kubeconfig
User "system:kube-proxy" set.
# kubectl config set-context default \
>     --cluster=kubernetes-the-hard-way \
>     --user=system:kube-proxy \
>     --kubeconfig=kube-proxy.kubeconfig
Context "default" created.
# kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
Switched to context "default".
  • kube-controller-manager 用

kube-controller-manager は、worker ノードではなく Control plane ノードにあります。
そのため、 --server では 127.0.0.1:6443 を指定すれば 各ノード上の API サーバーにつながります。

# kubectl config set-cluster kubernetes-the-hard-way \
>     --certificate-authority=ca.pem \
>     --embed-certs=true \
>     --server=https://127.0.0.1:6443 \
>     --kubeconfig=kube-controller-manager.kubeconfig
Cluster "kubernetes-the-hard-way" set.
# kubectl config set-credentials system:kube-controller-manager \
>     --client-certificate=kube-controller-manager.pem \
>     --client-key=kube-controller-manager-key.pem \
>     --embed-certs=true \
>     --kubeconfig=kube-controller-manager.kubeconfig
User "system:kube-controller-manager" set.
# kubectl config set-context default \
>     --cluster=kubernetes-the-hard-way \
>     --user=system:kube-controller-manager \
>     --kubeconfig=kube-controller-manager.kubeconfig
Context "default" created.
root@k8smaster0:/data/assam/k8s/ca# kubectl config use-context default --kubeconfig=kube-controller-manager.kubeconfig
Switched to context "default".
  • kube-scheduler 用

scheduler も controller-manager 同様 --server には 127.0.0.1:6443 を指定しています。

# kubectl config set-cluster kubernetes-the-hard-way \
>     --certificate-authority=ca.pem \
>     --embed-certs=true \
>     --server=https://127.0.0.1:6443 \
>     --kubeconfig=kube-scheduler.kubeconfig
Cluster "kubernetes-the-hard-way" set.
# kubectl config set-credentials system:kube-scheduler \
>     --client-certificate=kube-scheduler.pem \
>     --client-key=kube-scheduler-key.pem \
>     --embed-certs=true \
>     --kubeconfig=kube-scheduler.kubeconfig
User "system:kube-scheduler" set.
# kubectl config set-context default \
>     --cluster=kubernetes-the-hard-way \
>     --user=system:kube-scheduler \
>     --kubeconfig=kube-scheduler.kubeconfig
Context "default" created.
# kubectl config use-context default --kubeconfig=kube-scheduler.kubeconfig
Switched to context "default".
  • admin ユーザー用

ここでも control plane ノード上での実行を想定して、 127.0.0.1:6443 を指定しています。
ただ、 admin ユーザーでの kubectl 実行は、別にリモートノードでも問題ないです。
そのため、 127.0.0.1 の代わりに k8sapi を指定しておいても(今回の環境では)問題ありません。
(※今回の環境では k8sapi は control plane ノード#1 を指しているので、
ここで k8sapi と指定しても問題ありません。ただ、 kubernetes the hard way では
この段階では API サーバー用ロードバランサーが用意されていないため、 ロードバランサーの IP などを指定しているとつながらない、ということになります。 ロードバランサーが用意できた後の、第12回で外部の IPに変えています。)

# kubectl config set-cluster kubernetes-the-hard-way \
>     --certificate-authority=ca.pem \
>     --embed-certs=true \
>     --server=https://127.0.0.1:6443 \
>     --kubeconfig=admin.kubeconfig
Cluster "kubernetes-the-hard-way" set.
# kubectl config set-credentials admin \
>     --client-certificate=admin.pem \
>     --client-key=admin-key.pem \
>     --embed-certs=true \
>     --kubeconfig=admin.kubeconfig
User "admin" set.
# kubectl config set-context default \
>     --cluster=kubernetes-the-hard-way \
>     --user=admin \
>     --kubeconfig=admin.kubeconfig
Context "default" created.
# kubectl config use-context default --kubeconfig=admin.kubeconfig
Switched to context "default".

#Configuration ファイル配布

作成した configuration ファイルは以下の通りですが、
それぞれ control plane / worker 上に配布します。 
(別途各サーバー上で適切な場所に配置しなおすため、ここでは rootのホームディレクトリに配置しました)

ファイル 配布先
k8sworker0.kubeconfig k8sworker0
k8sworker1.kubeconfig k8sworker1
k8sworker2.kubeconfig k8sworker2
kube-proxy.kubeconfig k8sworker0,1,2
kube-controller-manager.kubeconfig k8smaster0,1,2
kube-scheduler.kubeconfig k8smaster0,1,2
admin.kubeconfig k8smaster0,1,2

kubelet, proxy は worker 上で稼働し、 controller-manager, scheduler は control plane 上で稼働することを考えると
配置先も理解しやすいと思います。
admin は kubectl を使うときですが、現時点では control plane から実施します。


今回はここまでとして、次回は Generating the Data Encryption Config and Key の部分を実施します。

6.Certificates
目次
8.Encryption Config and Key


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?