YOKOHEI.COM

YOKOHEI.COM

›Kubernetes the Hard Way

Kubernetes Basics

  • Kubernetes Basics
  • Commands
  • Static Pod
  • Drain & Uncordon
  • Cluster Upgrade
  • Backup & Restore
  • Certification
  • RBAC
  • CNI
  • CoreDNS
  • Ingress

Kubernetes the Hard Way

  • the Hard Way?
  • AWS Prerequisites
  • CA and TLS
  • Configuration Files
  • Data Encryption
  • Bootstrapping etcd
  • Bootstrapping Control Plane
  • Bootstrapping Worker Node
  • kubectl configuraton
  • Pod Network
  • RBAC for Kubelet
  • Coredns Add-On
  • Test
  • TLS Bootstrapping

Amazon EKS

  • EKS Introduction
  • Ingress with ALB
  • PersistentVolume with EBS
  • NetworkPolicy with Calico
  • Secret with KMS
  • EKS Hands-On

Kubernetes Configuration Files for Authentication

https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ にて述べられている設定ファイルを生成する。

Client Authentication Configs

ここでは、controller manager, kubelet, kube-proxy, scheduler clients, admin user についての設定ファイルを生成する。
kubernetes のエンドポイントとなる IP アドレスの指定が必要なのだが、今回は ELB などを前段に置かないようにしたので Master Node 1 の Private IP をエントリポイントとして利用した。
Master から kubectl も利用する。

kube-proxy 用 Configuration File

以下のコマンドにより生成する。

$ kubectl config set-cluster kubernetes-the-hard-way \
>     --certificate-authority=ca.crt \
>     --embed-certs=true \
>     --server=https://192.168.0.37:6443 \
>     --kubeconfig=kube-proxy.kubeconfig
Cluster "kubernetes-the-hard-way" set.

$ kubectl config set-credentials system:kube-proxy \
>     --client-certificate=kube-proxy.crt \
>     --client-key=kube-proxy.key \
>     --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-proxy はワーカーとマスターの通信になるので --server は自分はマスターの Private IP にした。ほんとは冗長化された VIP を使うべきだろう。
AWS だったら Internal NLB とか使うことになるだろうけど、なんかそれもちょっと微妙だな。

とりあえず、上記の結果として kube-proxy.kubeconfig というファイルが生成されていることがわかる。
これは後ほどワーカが利用する。

kube-controller-manager 用 Configuration File

同様に、以下コマンド。

$ kubectl config set-cluster kubernetes-the-hard-way \
>     --certificate-authority=ca.crt \
>     --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.crt \
>     --client-key=kube-controller-manager.key \
>     --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.

$ kubectl config use-context default --kubeconfig=kube-controller-manager.kubeconfig
Switched to context "default".

結果として kube-controller-manager.kubeconfig というファイルが生成されていることがわかる。

kube-scheduler 用 Configuration File

$ kubectl config set-cluster kubernetes-the-hard-way \
>     --certificate-authority=ca.crt \
>     --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.crt \
>     --client-key=kube-scheduler.key \
>     --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 用 Configuration File

$ kubectl config set-cluster kubernetes-the-hard-way \
>     --certificate-authority=ca.crt \
>     --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.crt \
>     --client-key=admin.key \
>     --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".

各ファイルの配布

Master Node 1 上で作ったので、2 に配るだけでよい。

$ scp -i .ssh/hoge.pem admin.kubeconfig kube-controller-manager.kubeconfig kube-scheduler.kubeconfig ubuntu@192.168.1.159:~/
admin.kubeconfig                                                                                                  100% 5301     5.5MB/s   00:00    
kube-controller-manager.kubeconfig                                                                                100% 5355     6.5MB/s   00:00    
kube-scheduler.kubeconfig                                                                                         100% 5317     6.0MB/s   00:00   

kube-proxy.kubeconfig は、ワーカーノードにくばる。
これにより、ワーカーノードは Master Node 1 に対してアクセスを行うこととなる。
(実際には LB などで冗長化して、VIP となるものを渡す認識)

for instance in worker1 worker2; do
    scp kube-proxy.kubeconfig ${instance}:~/
done
← CA and TLSData Encryption →
▼ Codes ▼
LeetCodeGitHub
▼ Profile ▼
LinkedInFlickr
▼ Logo made with DesignEvo ▼
DesignEvo
Copyright © 2020 Kohei Yoshida