Kubernetes1.6のkubeadmでのデプロイをメモっておく

コンテナはDockerで、ネットワークはCalicoで組んでいる。

全台

名前解決できるようにしておく必要がある

まず/etc/hostsとか設定しておく。

パッケージインストー

# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
        https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

# setenforce 0
# sed -i 's/enforcing/permissive/g' /etc/selinux/config

# systemctl stop firewalld
# systemctl disable firewalld

# yum install -y docker ebtables kubeadm kubectl kubelet kubernetes-cni

cgroupのドライバ的なものを指定

# systemctl enable docker && systemctl start docker

# mkdir /var/log/kubelet
# CGROUP_DRIVER=$(docker info 2>/dev/null | grep "Cgroup Driver" | awk '{print $3}')
# echo $CGROUP_DRIVER
    systemd
# sed -i "s|KUBELET_KUBECONFIG_ARGS=|KUBELET_KUBECONFIG_ARGS=--cgroup-driver=$CGROUP_DRIVER --enable-cri=false --logtostderr=false --log-dir=/var/log/kubelet |g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

DNSサーバのIPをデフォルト値から変更

# sed -i 's/10.96.0.10/10.3.3.10/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

オーバーレイFSのモジュールをロード

# sudo tee /etc/modules-load.d/overlay.conf <<-'EOF'
overlay
EOF

# sed -e '$ a STORAGE_DRIVER="overlay"' -i /etc/sysconfig/docker-storage-setup

# reboot
# lsmod | grep overlay

カーネルパラメータをいじる

# sysctl -w net.bridge.bridge-nf-call-iptables=1

# sed -e '$ a net.bridge.bridge-nf-call-iptables=1' -i /etc/sysctl.conf

kubeletサービス起動

# systemctl enable kubelet && systemctl start kubelet

このタイミングでは下記のエラーでkubeletが起動できず、再起動を繰り返す状態になるらしい。
kubeadmがkubeletを起動するので、問題ないとのこと。

error: failed to run Kubelet: invalid kubeconfig: stat /etc/kubernetes/kubelet.conf: no such file or directory


マスター

クラスタを初期化

# kubeadm init --pod-network-cidr=10.1.0.0/16 --service-cidr=10.3.3.0/24 --apiserver-advertise-address=192.168.66.26  

--pod-network-cidr
→各ミニオンに払い出されるIPネットワークのプール。
   各ミニオンは、払い出されたセグメントの中から各PodへIPを払い出す。

--service-cidr
→VIP用を払い出す為にキープされるセグメント。

--apiserver-advertise-address
→kube-apiserverがAPIを待ち受けるIP。
  このオプションがないと、デフォゲのインタフェースでkube-apiserverを待機させてしまうらしい。  

処理の最後に下記みたいな表示が出るので、メモっておく。

kubeadm join --token <token> <master-ip>:<master-port>

確認してみる。

# sudo cp /etc/kubernetes/admin.conf $HOME/
# sudo chown $(id -u):$(id -g) $HOME/admin.conf
# export KUBECONFIG=$HOME/admin.conf
# kubectl get nodes

# kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://192.168.66.26:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

ネットワーク設定

CNIという抽象化レイヤが用意されている。
ここに、使いたいプラグインを食わせて、Podのネットワークを構成する。


Calicoを単体で使う

# wget http://docs.projectcalico.org/v2.1/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml

# sed -i "s@192.168.0.0/16@10.1.0.0/16@" calico.yaml
# sed -i "s@10.96.232.136@10.3.3.100@" calico.yaml

# kubectl apply -f calico.yaml


マスターとミニオンを一台で済ませる場合

デフォルトでは、セキュリティ上の理由から、クラスタはマスター上にポッドをスケジュールしないようになっている。
オールインワンで使いたいときは、マスターマシン上でポッドをスケジュールされるように設定する。

# kubectl taint nodes --all node-role.kubernetes.io/master-

出力は次のような感じ。

node "test-01" tainted
taint key="dedicated" and effect="" not found.
taint key="dedicated" and effect="" not found.


マスターと別個にミニオンノードをインストールする場合

マスターの手順と同様に、dockerとkubeletの起動までやったら、下記を実行。

[root@kube-minion16-1 ~]# kubeadm join --token トークン 192.168.66.26:6443 ←マスターのIP
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[preflight] Running pre-flight checks
[discovery] Trying to connect to API Server "192.168.66.26:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://192.168.66.26:6443"
[discovery] Cluster info signature and contents are valid, will use API Server "https://192.168.66.26:6443"
[discovery] Successfully established connection with API Server "192.168.66.26:6443"
[bootstrap] Detected server version: v1.6.0
[bootstrap] The server supports the Certificates API (certificates.k8s.io/v1beta1)
[csr] Created API client to obtain unique certificate for this node, generating keys and certificate signing request
[csr] Received signed certificate from the API server, generating KubeConfig...
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"

Node join complete:
* Certificate signing request sent to master and response
  received.
* Kubelet informed of new secure connection details.

Run 'kubectl get nodes' on the master to see this machine join.
[root@kube-minion16-1 ~]#