Installing kubeadm
https://kubernetes.io/docs/tasks/tools/install -kubeadm/
•
kubeadm で kubernetes v1.8 + Flannel をインストール
https://qiita.com/hichihara/items/79ef6613026f8c13eb99
•
Kubeadm で Kubernetes をインストールする方法 : クイックガイド
https://www.mirantis.co.jp/blog/how-install-kubernetes-kubeadm/
•
CoreOS + flannel で複数ホスト間コンテナ通信をする
https://qiita.com/dtan4/items/8f9cf40aabd2e6c9a494
•
Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
https://www.slideshare.net/anikundesu/kubernetesflannelcniwindows -container-cluster
•
今からはじめる Kubernetes 入門
https://speakerdeck.com/thara0402/interact2018
•
Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション
•
Kuberentesクラスタ 1.10 をkubeadmで構築
https://mbook-x86.hatenablog.com/entry/2018/04/29/024210
•
参考
Installing kubeadm•
https://kubernetes.io/docs/setup/independent/install -kubeadm/
kubeadm のインストール
ホスト名の変更 newname=k8s-master
sudo sed -i -e "s/ubuntu/$newname/g" /etc/hosts
sudo sed -i -e "s/ubuntu/$newname/g" /etc/hostname
sudo hostname $newname
# vi /etc/sysconfig/network
sudo systemctl restart networking.service
IP の固定化 vi /etc/network/interfaces
auto eth0
iface eth0 inet static
address 10.108.0.1
netmask 255.255.255.0
gateway 10.255.255.254
dns-nameservers 10.0.0.1
systemctl restart networking
ネットワークの確認 MAC アドレスが k8s のノード内でユニークなっているか1.
ip link
product_uuid が k8s のノード内でユニークになっているか2.
sudo cat /sys/class/dmi/id/product_uuid
swap の無効化
Disabling Swap on a Kubernetes Node
https://docs.platform9.com/support/disabling-swap-kubernetes-node/
•
kubelet を実行する環境では、スワップは無効にしておく必要がある•
sudo swapoff -a
sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab
ポートアクセスの設定 Protocol Direction Port Range Purpose Used By
TCP Inbound 6443* Kubernetes API server All
TCP Inbound 2379-2380 etcd server client API kube-apiserver, etcd
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 10251 kube-scheduler Self
TCP Inbound 10252 kube-controller-manager Self
https://kubernetes.io/docs/setup/independent/install -kubeadm/ より引用
docker のインストール apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"
apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.03 | head -1 | awk '{print $3}')
docker --version
各種ツールのインストール apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
kubelet については、「kubelet.service」としてサービスとしてインストールされる
構成ファイルは「/etc/systemd/system/kubelet.service.d/」に配置される
この段階では、kubeadm による設定を行っていないため、kubelet はクラッシュループを継続した状態となる
cgroup の確認 docker を Container Runtime Interface (CRI) として使用する場合は自動的に設定が行われるので明示的な設定は不要
docker の cgroup ドライバーの確認 docker info | grep -i cgroup cgroupfs が使われているはず
CRI の設定 /etc/default/kubelet にKUBELET_KUBEADM_EXTRA_ARGS が定義されている docker 以外の CRI (cgroupfs) を利用する場合は設定
Creating a single master cluster with kubeadm
https://kubernetes.io/docs/setup/independent/create -cluster-kubeadm/
•
マスタークラスターのインストール
kubeadm を使用したインストール 初期セットアップの実行 kubeadm init --pod-network-cidr=10.244.0.0/16
※上記 cidr は flannel を使用する場合の固定値
--apiserver-bind-port int32 Default: 6443
--cert-dir string Default: "/etc/kubernetes/pki"
--kubernetes-version string Default: "stable-1.10"
--service-cidr string Default: "10.96.0.0/12"
--service-dns-domain string Default: "cluster.local"
kubeadm join 10.108.0.1:6443 --token 2m2kks.5mg61l8z1a53hjjb --discovery-token-ca-cert-hash
kubeadm init•
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
kubeadm reset•
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-reset/
インストール (シングルクラスター)
2018年7月15日 11:35
Docker - 1 ページ
kubeadm join 10.108.0.1:6443 --token 2m2kks.5mg61l8z1a53hjjb --discovery-token-ca-cert-hash
sha256:2f911f824f20a03216453c95c1108433f1b360e03525f589b8decbd0a4150e94
実行後に出力される上記のメッセージがワーカーノードの参加で必要となる
初期設定ではトークンの有効期間は 24 時間となっており、次のコマンドで操作できる。
トークンの確認 kubeadm token list
トークンの作成 kubeadm token create
証明書ハッシュの取得 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | 
openssl dgst -sha256 -hex | sed 's/^.* //'
クラスターの破棄 kubeadm reset
初期セットアップが完了すると、kubelet のクラッシュループが解消され起動した状態となる
kubectl 実行用の構成情報のコピー kubeadm で生成された構成情報のユーザープロファイルへのコピー
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
※root の場合、以下で代替も可能
export KUBECONFIG=/etc/kubernetes/admin.conf
状態の確認 kubeadm config view
kubectl cluster-info
kubectl config get-clusters
kubectl config get-contexts
get-clusters を実行した際に、6443 ではなく、localhost:8080 になっている場合は、構成情報が認識できていない
Flannel の導入 Pod 同士の通信を可能にするためアドオンをインストールする
アドオンをインストールしないと Pod 間の通信ができない
kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-78fcdf6894-spg2c 0/1 Pending 0 5m
kube-system coredns-78fcdf6894-xjbh6 0/1 Pending 0 5m
kube-system etcd-k8s-master 0/1 Pending 0 2s
kube-system kube-apiserver-k8s-master 0/1 Pending 0 2s
kube-system kube-controller-manager-k8s-master 0/1 Pending 0 2s
kube-system kube-proxy-mmgjw 1/1 NodeLost 0 5m
kube-system kube-scheduler-k8s-master 0/1 Pending 0 2s
今回は、Flannel を使用して通信を可能にする
iptables のチェーンにブリッジされたトラフィックを許可 sysctl net.bridge.bridge-nf-call-iptables=1
flannel のインストール kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-78fcdf6894-spg2c 1/1 Running 0 6m
kube-system coredns-78fcdf6894-xjbh6 1/1 Running 0 6m
kube-system etcd-k8s-master 1/1 Running 0 12s
kube-system kube-apiserver-k8s-master 1/1 Running 0 11s
kube-system kube-controller-manager-k8s-master 1/1 Running 0 11s
kube-system kube-flannel-ds-d75cf 1/1 Running 0 18s
kube-system kube-proxy-mmgjw 1/1 Running 0 6m
kube-system kube-scheduler-k8s-master 1/1 Running 0 10s
マスターで pod を実行可能にする デフォルトではマスターで Pod を実行することはできないので、シングルクラスターの構成で実行する場合に実行
kubectl taint nodes --all node-role.kubernetes.io/master-
Kubernetes Dashboard
https://github.com/kubernetes/dashboard
•
Installation
https://github.com/kubernetes/dashboard/wiki/Installation
•
KubernetesにDashboardをインストールして、認証なしでアクセスする
https://qiita.com/sheepland/items/0ee17b80fcfb10227a41
•
Kubernetes 1.8のアクセス制御について。あとDashboard。
https://www.kaitoy.xyz/2017/10/31/retry-dashboard-on-k8s-cluster-by-kubeadm/
•
How to sign in kubernetes dashboard?
https://stackoverflow.com/questions/46664104/how-to-sign-in-kubernetes-dashboard
•
ダッシュボードの展開
デプロイ
ローカルからプロキシを介しての HTTP アクセスとなり、リモートから HTTP 接続はできない•
証明書のセットアップは実施していないためローカルアクセスのみを想定•
プロキシを使用せず、直接 HTTPS でアクセスするためには、推奨セットアップを実施する•
クイックセットアップ Kubernetes Dashboard
https://github.com/kubernetes/dashboard/blob/master/README.md
•
デプロイ 作成 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
削除 kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
設定の確認 kubectl -n kube-system edit service kubernetes-dashboard
spec:
clusterIP: 10.98.24.238
ports:
- port: 443
protocol: TCP
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: ClusterIP
HTTP でアクセス可能な環境として実行•
代替セットアップ デプロイ 作成 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml
削除 kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml
設定の確認 kubectl -n kube-system edit service kubernetes-dashboard
spec:
clusterIP: 10.110.248.246
ports:
- port: 80
protocol: TCP
targetPort: 9090
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: ClusterIP
HTTPS を使用して、外部からアクセスできる環境を整えたセットアップ•
推奨セットアップ 証明書の作成 Certificate management
https://github.com/kubernetes/dashboard/wiki/Certificate-management
•
RSA 秘密鍵の作成 openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048
Docker - 2 ページ
RSA 秘密鍵の作成 openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048
openssl rsa -passin pass:x -in dashboard.pass.key -out dashboard.key
rm dashboard.pass.key
CRL 要求の作成 openssl req -new -key dashboard.key -out dashboard.csr
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Kairakutei
Locality Name (eg, city) []:MasterEros
Organization Name (eg, company) [Internet Widgits Pty Ltd]:erosuzaibatsu
Organizational Unit Name (eg, section) []:Freelance
Common Name (e.g. server FQDN or YOUR name) []:10.108.0.1
以降は任意項目
SSL 証明書の作成 openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt
シークレットの作成 作成 kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kube-system
確認 kubectl get secrets -n kube-system kubernetes-dashboard-certs
デプロイ 作成 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
削除 kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
設定の確認 kubectl -n kube-system edit service kubernetes-dashboard
spec:
clusterIP: 10.102.63.36
ports:
- port: 443
protocol: TCP
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: ClusterIP
アクセス方法
プロキシを起動してのアクセス プロキシの起動 ローカルからのアクセス用プロキシ kubectl proxy
リモートからのアクセス用プロキシ kubectl proxy --address 0.0.0.0 --accept-hosts '.*'
version 1.7 以降のダッシュボードの場合、http でプロキシ経由でトークンを使用してアクセスすることができない
(トークンを入力して、サインインを押しても反応がない)
Can't sign in into dashboard #2735
https://github.com/kubernetes/dashboard/issues/2735
•
Accessing Dashboard 1.7.X and above
https://github.com/kubernetes/dashboard/wiki/Accessing -Dashboard---1.7.X-and-above
•
version 1.7 のダッシュボードでは、セキュリティが強化され、HTTP エンドポイントでのトークンを使用したアクセスは、localhost / 127.0.0.1 からのみ実施できるようになっているため。
Skip することで、ダッシュボードにアクセスができるが、「system:serviceaccount:kube-system:kubernetes-dashboard」に権限がなく、ほとんどの操作ができない
外部からアクセスする場合には HTTPS エンドポイントを使用する必要があるが、これには推奨セットアップが必要
アクセス URL http://10.108.0.1:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
http://localhost:8001/ui のアクセスは廃止予定のため上記の URL を使用する
NodePort でのアクセス
(プロキシを使用しないでノード上でポートをオープンする)
NodePort の設定 kubectl -n kube-system edit service kubernetes-dashboard
type: ClusterIP を type: NodePortに変更
ports: に以下のエントリを追加
nodePort: 31500
ポートの確認 kubectl -n kube-system get service kubernetes-dashboard
nodePort を指定したことにより、ポートは固定で設定される
URL にアクセス https://10.108.0.1:31500
Authentication
https://github.com/kubernetes/dashboard/wiki/Access -control#authentication
•
トークンを使用した認証
リモートからのアクセスでは、認証が発生するため、使用するサービスアカウントに関連付けられているシークレットのトークンを確認し、認証を実施する必要がある。
サービスアカウントとトークンは事前に登録されているものがあり、それを使用することができる。
ダッシュボードの認証をスキップした場合は「system:serviceaccount:kube-system:kubernetes-dashboard」のサービスアカウントが使用される。
サービスアカウント 一覧 kubectl -n kube-system get serviceaccount
特定のアカウント kubectl -n kube-system get serviceaccount deployment-controller
詳細の取得 kubectl -n kube-system describe serviceaccount deployment-controller
シークレット 一覧 kubectl -n kube-system get secret
特定のシークレット kubectl -n kube-system describe secret deployment-controller
トークン部分のみを取得
How to sign in kubernetes dashboard?
https://stackoverflow.com/questions/46664104/how-to-sign-in-kubernetes-dashboard
•
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | awk '/^deployment-controller-token-/{print $1}') | awk '$1=="token:"{print $2}'
初期のサービスアカウントでは、ロール単位で限定的な割り当てとなっているため、管理用のアカウントを作成する場合は次の方法を行う。
サービスアカウント 作成 kubectl create serviceaccount cluster-admin-dashboard-sa
削除 kubectl delete serviceaccount cluster-admin-dashboard-sa
ロールの設定 作成 kubectl create clusterrolebinding cluster-admin-dashboard-sa 
--clusterrole=cluster-admin 
--serviceaccount=default:cluster-admin-dashboard-sa
削除 kubectl delete clusterrolebinding cluster-admin-dashboard-sa
トークンを取得 kubectl describe secret cluster-admin-dashboard-sa-token
セキュリティ的に好ましくないが、ダッシュボードを HTTP 経由に変更し、kubernetes-dashboard に cluster-admin を設定することで、すべてのユーザーを管理権限で使用させることもできる
(開発用途での利用を想定 / HTTPS でログインをスキップした場合も同様)
KubernetesにDashboardをインストールして、認証なしでアクセスする
https://qiita.com/sheepland/items/0ee17b80fcfb10227a41
•
YAML で作成 cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
labels:
k8s-app: kubernetes-dashboard
Docker - 3 ページ
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kube-system
EOF
オプションで作成 kubectl create clusterrolebinding kubernetes-dashboard 
--clusterrole=cluster-admin 
--serviceaccount=kube-system:kubernetes-dashboard
削除 kubectl delete clusterrolebinding kubernetes-dashboard
Docker - 4 ページ

K8s install (single cluster)

  • 1.
    Installing kubeadm https://kubernetes.io/docs/tasks/tools/install -kubeadm/ • kubeadmで kubernetes v1.8 + Flannel をインストール https://qiita.com/hichihara/items/79ef6613026f8c13eb99 • Kubeadm で Kubernetes をインストールする方法 : クイックガイド https://www.mirantis.co.jp/blog/how-install-kubernetes-kubeadm/ • CoreOS + flannel で複数ホスト間コンテナ通信をする https://qiita.com/dtan4/items/8f9cf40aabd2e6c9a494 • Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション https://www.slideshare.net/anikundesu/kubernetesflannelcniwindows -container-cluster • 今からはじめる Kubernetes 入門 https://speakerdeck.com/thara0402/interact2018 • Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション Kubernetes、Flannel、CNIでWindows Container Clusterオーケストレーション • Kuberentesクラスタ 1.10 をkubeadmで構築 https://mbook-x86.hatenablog.com/entry/2018/04/29/024210 • 参考 Installing kubeadm• https://kubernetes.io/docs/setup/independent/install -kubeadm/ kubeadm のインストール ホスト名の変更 newname=k8s-master sudo sed -i -e "s/ubuntu/$newname/g" /etc/hosts sudo sed -i -e "s/ubuntu/$newname/g" /etc/hostname sudo hostname $newname # vi /etc/sysconfig/network sudo systemctl restart networking.service IP の固定化 vi /etc/network/interfaces auto eth0 iface eth0 inet static address 10.108.0.1 netmask 255.255.255.0 gateway 10.255.255.254 dns-nameservers 10.0.0.1 systemctl restart networking ネットワークの確認 MAC アドレスが k8s のノード内でユニークなっているか1. ip link product_uuid が k8s のノード内でユニークになっているか2. sudo cat /sys/class/dmi/id/product_uuid swap の無効化 Disabling Swap on a Kubernetes Node https://docs.platform9.com/support/disabling-swap-kubernetes-node/ • kubelet を実行する環境では、スワップは無効にしておく必要がある• sudo swapoff -a sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab ポートアクセスの設定 Protocol Direction Port Range Purpose Used By TCP Inbound 6443* Kubernetes API server All TCP Inbound 2379-2380 etcd server client API kube-apiserver, etcd TCP Inbound 10250 Kubelet API Self, Control plane TCP Inbound 10251 kube-scheduler Self TCP Inbound 10252 kube-controller-manager Self https://kubernetes.io/docs/setup/independent/install -kubeadm/ より引用 docker のインストール apt-get update apt-get install -y apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - add-apt-repository "deb https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable" apt-get update && apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.03 | head -1 | awk '{print $3}') docker --version 各種ツールのインストール apt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl kubelet については、「kubelet.service」としてサービスとしてインストールされる 構成ファイルは「/etc/systemd/system/kubelet.service.d/」に配置される この段階では、kubeadm による設定を行っていないため、kubelet はクラッシュループを継続した状態となる cgroup の確認 docker を Container Runtime Interface (CRI) として使用する場合は自動的に設定が行われるので明示的な設定は不要 docker の cgroup ドライバーの確認 docker info | grep -i cgroup cgroupfs が使われているはず CRI の設定 /etc/default/kubelet にKUBELET_KUBEADM_EXTRA_ARGS が定義されている docker 以外の CRI (cgroupfs) を利用する場合は設定 Creating a single master cluster with kubeadm https://kubernetes.io/docs/setup/independent/create -cluster-kubeadm/ • マスタークラスターのインストール kubeadm を使用したインストール 初期セットアップの実行 kubeadm init --pod-network-cidr=10.244.0.0/16 ※上記 cidr は flannel を使用する場合の固定値 --apiserver-bind-port int32 Default: 6443 --cert-dir string Default: "/etc/kubernetes/pki" --kubernetes-version string Default: "stable-1.10" --service-cidr string Default: "10.96.0.0/12" --service-dns-domain string Default: "cluster.local" kubeadm join 10.108.0.1:6443 --token 2m2kks.5mg61l8z1a53hjjb --discovery-token-ca-cert-hash kubeadm init• https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/ kubeadm reset• https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-reset/ インストール (シングルクラスター) 2018年7月15日 11:35 Docker - 1 ページ
  • 2.
    kubeadm join 10.108.0.1:6443--token 2m2kks.5mg61l8z1a53hjjb --discovery-token-ca-cert-hash sha256:2f911f824f20a03216453c95c1108433f1b360e03525f589b8decbd0a4150e94 実行後に出力される上記のメッセージがワーカーノードの参加で必要となる 初期設定ではトークンの有効期間は 24 時間となっており、次のコマンドで操作できる。 トークンの確認 kubeadm token list トークンの作成 kubeadm token create 証明書ハッシュの取得 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' クラスターの破棄 kubeadm reset 初期セットアップが完了すると、kubelet のクラッシュループが解消され起動した状態となる kubectl 実行用の構成情報のコピー kubeadm で生成された構成情報のユーザープロファイルへのコピー mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ※root の場合、以下で代替も可能 export KUBECONFIG=/etc/kubernetes/admin.conf 状態の確認 kubeadm config view kubectl cluster-info kubectl config get-clusters kubectl config get-contexts get-clusters を実行した際に、6443 ではなく、localhost:8080 になっている場合は、構成情報が認識できていない Flannel の導入 Pod 同士の通信を可能にするためアドオンをインストールする アドオンをインストールしないと Pod 間の通信ができない kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-78fcdf6894-spg2c 0/1 Pending 0 5m kube-system coredns-78fcdf6894-xjbh6 0/1 Pending 0 5m kube-system etcd-k8s-master 0/1 Pending 0 2s kube-system kube-apiserver-k8s-master 0/1 Pending 0 2s kube-system kube-controller-manager-k8s-master 0/1 Pending 0 2s kube-system kube-proxy-mmgjw 1/1 NodeLost 0 5m kube-system kube-scheduler-k8s-master 0/1 Pending 0 2s 今回は、Flannel を使用して通信を可能にする iptables のチェーンにブリッジされたトラフィックを許可 sysctl net.bridge.bridge-nf-call-iptables=1 flannel のインストール kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-78fcdf6894-spg2c 1/1 Running 0 6m kube-system coredns-78fcdf6894-xjbh6 1/1 Running 0 6m kube-system etcd-k8s-master 1/1 Running 0 12s kube-system kube-apiserver-k8s-master 1/1 Running 0 11s kube-system kube-controller-manager-k8s-master 1/1 Running 0 11s kube-system kube-flannel-ds-d75cf 1/1 Running 0 18s kube-system kube-proxy-mmgjw 1/1 Running 0 6m kube-system kube-scheduler-k8s-master 1/1 Running 0 10s マスターで pod を実行可能にする デフォルトではマスターで Pod を実行することはできないので、シングルクラスターの構成で実行する場合に実行 kubectl taint nodes --all node-role.kubernetes.io/master- Kubernetes Dashboard https://github.com/kubernetes/dashboard • Installation https://github.com/kubernetes/dashboard/wiki/Installation • KubernetesにDashboardをインストールして、認証なしでアクセスする https://qiita.com/sheepland/items/0ee17b80fcfb10227a41 • Kubernetes 1.8のアクセス制御について。あとDashboard。 https://www.kaitoy.xyz/2017/10/31/retry-dashboard-on-k8s-cluster-by-kubeadm/ • How to sign in kubernetes dashboard? https://stackoverflow.com/questions/46664104/how-to-sign-in-kubernetes-dashboard • ダッシュボードの展開 デプロイ ローカルからプロキシを介しての HTTP アクセスとなり、リモートから HTTP 接続はできない• 証明書のセットアップは実施していないためローカルアクセスのみを想定• プロキシを使用せず、直接 HTTPS でアクセスするためには、推奨セットアップを実施する• クイックセットアップ Kubernetes Dashboard https://github.com/kubernetes/dashboard/blob/master/README.md • デプロイ 作成 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml 削除 kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml 設定の確認 kubectl -n kube-system edit service kubernetes-dashboard spec: clusterIP: 10.98.24.238 ports: - port: 443 protocol: TCP targetPort: 8443 selector: k8s-app: kubernetes-dashboard sessionAffinity: None type: ClusterIP HTTP でアクセス可能な環境として実行• 代替セットアップ デプロイ 作成 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml 削除 kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml 設定の確認 kubectl -n kube-system edit service kubernetes-dashboard spec: clusterIP: 10.110.248.246 ports: - port: 80 protocol: TCP targetPort: 9090 selector: k8s-app: kubernetes-dashboard sessionAffinity: None type: ClusterIP HTTPS を使用して、外部からアクセスできる環境を整えたセットアップ• 推奨セットアップ 証明書の作成 Certificate management https://github.com/kubernetes/dashboard/wiki/Certificate-management • RSA 秘密鍵の作成 openssl genrsa -des3 -passout pass:x -out dashboard.pass.key 2048 Docker - 2 ページ
  • 3.
    RSA 秘密鍵の作成 opensslgenrsa -des3 -passout pass:x -out dashboard.pass.key 2048 openssl rsa -passin pass:x -in dashboard.pass.key -out dashboard.key rm dashboard.pass.key CRL 要求の作成 openssl req -new -key dashboard.key -out dashboard.csr Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Kairakutei Locality Name (eg, city) []:MasterEros Organization Name (eg, company) [Internet Widgits Pty Ltd]:erosuzaibatsu Organizational Unit Name (eg, section) []:Freelance Common Name (e.g. server FQDN or YOUR name) []:10.108.0.1 以降は任意項目 SSL 証明書の作成 openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt シークレットの作成 作成 kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kube-system 確認 kubectl get secrets -n kube-system kubernetes-dashboard-certs デプロイ 作成 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml 削除 kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml 設定の確認 kubectl -n kube-system edit service kubernetes-dashboard spec: clusterIP: 10.102.63.36 ports: - port: 443 protocol: TCP targetPort: 8443 selector: k8s-app: kubernetes-dashboard sessionAffinity: None type: ClusterIP アクセス方法 プロキシを起動してのアクセス プロキシの起動 ローカルからのアクセス用プロキシ kubectl proxy リモートからのアクセス用プロキシ kubectl proxy --address 0.0.0.0 --accept-hosts '.*' version 1.7 以降のダッシュボードの場合、http でプロキシ経由でトークンを使用してアクセスすることができない (トークンを入力して、サインインを押しても反応がない) Can't sign in into dashboard #2735 https://github.com/kubernetes/dashboard/issues/2735 • Accessing Dashboard 1.7.X and above https://github.com/kubernetes/dashboard/wiki/Accessing -Dashboard---1.7.X-and-above • version 1.7 のダッシュボードでは、セキュリティが強化され、HTTP エンドポイントでのトークンを使用したアクセスは、localhost / 127.0.0.1 からのみ実施できるようになっているため。 Skip することで、ダッシュボードにアクセスができるが、「system:serviceaccount:kube-system:kubernetes-dashboard」に権限がなく、ほとんどの操作ができない 外部からアクセスする場合には HTTPS エンドポイントを使用する必要があるが、これには推奨セットアップが必要 アクセス URL http://10.108.0.1:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ http://localhost:8001/ui のアクセスは廃止予定のため上記の URL を使用する NodePort でのアクセス (プロキシを使用しないでノード上でポートをオープンする) NodePort の設定 kubectl -n kube-system edit service kubernetes-dashboard type: ClusterIP を type: NodePortに変更 ports: に以下のエントリを追加 nodePort: 31500 ポートの確認 kubectl -n kube-system get service kubernetes-dashboard nodePort を指定したことにより、ポートは固定で設定される URL にアクセス https://10.108.0.1:31500 Authentication https://github.com/kubernetes/dashboard/wiki/Access -control#authentication • トークンを使用した認証 リモートからのアクセスでは、認証が発生するため、使用するサービスアカウントに関連付けられているシークレットのトークンを確認し、認証を実施する必要がある。 サービスアカウントとトークンは事前に登録されているものがあり、それを使用することができる。 ダッシュボードの認証をスキップした場合は「system:serviceaccount:kube-system:kubernetes-dashboard」のサービスアカウントが使用される。 サービスアカウント 一覧 kubectl -n kube-system get serviceaccount 特定のアカウント kubectl -n kube-system get serviceaccount deployment-controller 詳細の取得 kubectl -n kube-system describe serviceaccount deployment-controller シークレット 一覧 kubectl -n kube-system get secret 特定のシークレット kubectl -n kube-system describe secret deployment-controller トークン部分のみを取得 How to sign in kubernetes dashboard? https://stackoverflow.com/questions/46664104/how-to-sign-in-kubernetes-dashboard • kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | awk '/^deployment-controller-token-/{print $1}') | awk '$1=="token:"{print $2}' 初期のサービスアカウントでは、ロール単位で限定的な割り当てとなっているため、管理用のアカウントを作成する場合は次の方法を行う。 サービスアカウント 作成 kubectl create serviceaccount cluster-admin-dashboard-sa 削除 kubectl delete serviceaccount cluster-admin-dashboard-sa ロールの設定 作成 kubectl create clusterrolebinding cluster-admin-dashboard-sa --clusterrole=cluster-admin --serviceaccount=default:cluster-admin-dashboard-sa 削除 kubectl delete clusterrolebinding cluster-admin-dashboard-sa トークンを取得 kubectl describe secret cluster-admin-dashboard-sa-token セキュリティ的に好ましくないが、ダッシュボードを HTTP 経由に変更し、kubernetes-dashboard に cluster-admin を設定することで、すべてのユーザーを管理権限で使用させることもできる (開発用途での利用を想定 / HTTPS でログインをスキップした場合も同様) KubernetesにDashboardをインストールして、認証なしでアクセスする https://qiita.com/sheepland/items/0ee17b80fcfb10227a41 • YAML で作成 cat <<EOF | kubectl create -f - apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard labels: k8s-app: kubernetes-dashboard Docker - 3 ページ
  • 4.
    k8s-app: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind:ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: kubernetes-dashboard namespace: kube-system EOF オプションで作成 kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard 削除 kubectl delete clusterrolebinding kubernetes-dashboard Docker - 4 ページ