kubernetes on OpenStack Queens


OpenStack Queens 上にVM3つ立ててk8sの確認。
kubeadm(実施時β)で構築。

後で、kuberenetes-dashboard導入時に外からのWebUI表示が上手くいかなかったので外側のネットワークはブリッジ接続にした。(「考察」参考)

環境

  • インスタンス情報
    • CPU x 2
    • Memory 2GB
    • Disk 20GB

準備

  • インスタンスを3つたてる(少ないので適当に手動)
  • Ubuntu 16.04 を利用
  • kubernetes v1.10.2
  • ローカルのDNS Server(192.168.0.2)に登録

kubeadm 等インストール

雑だが、Ansible Playbookによりざっと作る。

  • Ansible (OpenStack Host):192.168.0.3
  • Master x1:192.168.0.60
  • Worker Node x2:192.168.0.61,192.168.0.61

clientVersion:
  buildDate: 2018-04-27T09:22:21Z
  compiler: gc
  gitCommit: 81753b10df112992bf51bbc2c2f85208aad78335
  gitTreeState: clean
  gitVersion: v1.10.2
  goVersion: go1.9.3
  major: "1"
  minor: "10"
  platform: linux/amd64
serverVersion:
  buildDate: 2018-04-27T09:10:24Z
  compiler: gc
  gitCommit: 81753b10df112992bf51bbc2c2f85208aad78335
  gitTreeState: clean
  gitVersion: v1.10.2
  goVersion: go1.9.3
  major: "1"
  minor: "10"
  platform: linux/amd64

インストール後の確認補足

Configure cgroup driver used by kubelet on Master Node

kubelet により使われる --cgroup-driver を合わせる。

Ubuntu はデフォルトで cgroupfs , Fedora/CentOS/RHELは systemd

クラスタ・セットアップ

Master

Pod内ネットワークはFlannelを使う。

# kubeadm init --pod-network-cidr=10.244.0.0/16

kubectlをrootでないユーザで実行するための環境セットアップ。

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

この時点では kube-dns は Pennding

Podネットワークを構成

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

この後、Master が Readyに

$ kubectl -n kube-system get pod
NAME                                      READY     STATUS    RESTARTS   AGE
etcd-master-1.tk.net                      1/1       Running   0          2m
kube-apiserver-master-1.tk.net            1/1       Running   1          3m
kube-controller-manager-master-1.tk.net   1/1       Running   0          3m
kube-dns-86f4d74b45-wjdqq                 3/3       Running   0          2m
kube-flannel-ds-sl5n4                     1/1       Running   0          1m
kube-proxy-d4945                          1/1       Running   0          2m

Node

Worker Nodeを追加(追加するノード上、rootで)

# kubeadm join 192.168.0.60:6443 --token gw2eln.tp133sqp4c5mudqj --discovery-token-ca-cert-hash sha256:2a16400b56be121cb6f67301344b40b97ad7a267c92dc46f562ba5bdb8dd84ea

トークン期限が切れたら、 kubeadm token create で作る

NAME              STATUS    ROLES     AGE       VERSION
master-1.tk.net   Ready     master    6m        v1.10.2
node-1.tk.net     Ready     <none>    36s       v1.10.2
node-2.tk.net     Ready     <none>    22s       v1.10.2

クラスタセットアップ後補足

デフォルトだとMasterにはApp Podがスケジュールされない。もししたいのであれば、以下のコマンドを実行

$ kubectl taint nodes --all node-role.kubernetes.io/master-
  • デフォルトで Worker Node が全滅した場合には Master に寄った
  • taint はPodのノードスケジューリングをコントロール

.kube/config

コンテキストを更新(ここではNamespaceだけの違い)

$ kubectl config set-context devel --cluster=kubernetes --user=kubernetes-admin --namespace=devel
$ kubectl config set-context guestbook --cluster=kubernetes --user=kubernetes-admin --namespace=guestbook
.kube/config
contexts:
- context:
    cluster: kubernetes
    namespace: devel
    user: kubernetes-admin
  name: devel
- context:
    cluster: kubernetes
    namespace: guestbook
    user: kubernetes-admin
  name: guestbook
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: devel

ダッシュボード

  1. ダッシュボードのマニフェスト apply
  2. クライアント証明書を作ってブラウザにインポートしブラウザ再起動
  3. ダッシュボード用secretを作成
  4. WebUIに確認
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
secret "kubernetes-dashboard-certs" configured
serviceaccount "kubernetes-dashboard" created
role.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created
rolebinding.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created
deployment.apps "kubernetes-dashboard" created
service "kubernetes-dashboard" created
$ grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
$ grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
$ openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
$ kubectl create secret generic kubernetes-dashboard-certs --from-file=./kubecfg.crt -n kube-system

アクセスコントロールついては、下記を参照しプロダクションではNGだが、とりあえず「Admin privileges」を適用。画面上は「Skip」で。

dashboard-admin.yml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system
$ kubectl create -f dashboard-admin.yml
clusterrolebinding.rbac.authorization.k8s.io "kubernetes-dashboard" created

考察

kubernetes-dashboardのWebUIが表示できなかった件

インスタンスをPrivate Networkの配下に置き、External NetworkからはFloating IPアドレス経由でアクセスしていた場合、
k8sクラスタ外、且つOpenStackのExternal NetworkからK8sのDashbardにはアクセスできなかった。
ブラウザ上は以下のようなタイムアウト。これはDashboardの問題ではなく、ネットワーク上の問題。

Error: 'dial tcp 10.233.65.9:8443: getsockopt: connection timed out'
Trying to reach: 'http://10.233.65.9:8443/'

OpenStack は1ノードで構成されているためトラブルシュートのため、
External Networkへフラット接続するようにブリッジにしてやり直したら、アクセスできるようになった。

Snippet

Tear down

構成しなおす時など、クラスタから解除と登録情報削除。

Masterにて、

$ kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
$ kubectl delete node <node name>

削除されたNodeにて、(root)

# kubeadm reset