OS >

目次

インストール

MiniKube

こちらをご参照ください。

ベアメタル(的)

  • セットアップ検証は、VirtualBoxで行っています。ベアメタルや従来のハイパーバイザ型の仮想化環境で問題なく動作するでしょう。
  • ubuntu.pngUbuntu 16.04およびcentos.pngCentOS 7で動作を確認しています。
  • ノードの基本セットアップには筆者の作成したcake.pngkubernetes-gridクックブックを使用しています。
  • ノードの基本セットアップ後は、kubeadmによりクラスタの構築を行います。
  1. chef-soloでノードの基本セットアップを行います。仮想化環境であれば、構築後のこのインスタンスをイメージ化して再利用するとよいでしょう。Kubernetes関連パッケージの依存環境を確認してみると、kubeadm パッケージをインストールする時点でMasterノードとWorkerノードの差異がなくなりますので、どのノードも以下の同じ基本セットアップで問題ありません。
    1. マシンインスタンスを用意し、あらかじめ git と chef-client をインストールしておきます。
      Ubuntu:$ sudo apt-get install ca-certificates curl git
      CentOS:$ sudo yum     install ca-certificates curl git
      $ curl -L https://omnitruck.chef.io/install.sh | sudo bash
    2. 以下の要領で、ノードの基本インストールを行います(DockerのセットアップとKubernetes関連パッケージのインストールが行われます)。もし、設定のカスタマイズが必要な場合には、あらかじめ roles/kube.rb を編集して行います。
      $ git clone git://git.osdn.net/gitroot/metasearch/grid-chef-repo.git
      $ cd grid-chef-repo/
      $ sudo chef-solo -c solo.rb -j nodes/local-kube-gp-node.json
  2. 同じ要領で必要な数のノードを用意します。
  3. 広報するアドレスを指定してMasterノードを初期化します。note.png当然ながらここで生成されたトークンは秘密情報ですので、取り扱いに注意してください。
    $ sudo rm -rf /var/lib/kubelet
    
    $ sudo kubeadm init --api-advertise-addresses=192.168.56.121
    [kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.
    [preflight] Running pre-flight checks
    [init] Using Kubernetes version: v1.5.2
    [tokens] Generated token: "0121fe.b138a58e697afe76"
    [certificates] Generated Certificate Authority key and certificate.
    [certificates] Generated API Server key and certificate
    [certificates] Generated Service Account signing keys
    [certificates] Created keys and certificates in "/etc/kubernetes/pki"
    [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
    [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
    [apiclient] Created API client, waiting for the control plane to become ready
    [apiclient] All control plane components are healthy after 163.799899 seconds
    [apiclient] Waiting for at least one node to register and become ready
    [apiclient] First node is ready after 4.504137 seconds
    [apiclient] Creating a test deployment
    [apiclient] Test deployment succeeded
    [token-discovery] Created the kube-discovery deployment, waiting for it to become ready
    [token-discovery] kube-discovery is ready after 76.002780 seconds
    [addons] Created essential addon: kube-proxy
    [addons] Created essential addon: kube-dns
    
    Your Kubernetes master has initialized successfully!
    
    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
        http://kubernetes.io/docs/admin/addons/
    
    You can now join any number of machines by running the following on each node:
    
    kubeadm join --token=0121fe.b138a58e697afe76 192.168.56.121
  4. 次にPodネットワークをセットアップします。以下の例はCalicoを使用する場合です。
    $ sudo kubectl apply -f http://docs.projectcalico.org/v2.0/getting-started/kubernetes/installation/hosted/kubeadm/calico.yaml
    configmap "calico-config" created
    daemonset "calico-etcd" created
    service "calico-etcd" created
    daemonset "calico-node" created
    deployment "calico-policy-controller" created
    job "configure-calico" created
  5. パタメータにトークンを与えて各Workerノードをクラスタに参加させていきます。
    $ sudo rm -rf /var/lib/kubelet
    
    $ sudo kubeadm join --token=e23791.b83996841b4b06ec 192.168.56.121
    [kubeadm] WARNING: kubeadm is in alpha, please do not use it for production clusters.
    [preflight] Running pre-flight checks
    [tokens] Validating provided token
    [discovery] Created cluster info discovery client, requesting info from "http://192.168.56.121:9898/cluster-info/v1/?token-id=e23791"
    [discovery] Cluster info object received, verifying signature using given token
    [discovery] Cluster info signature and contents are valid, will use API endpoints [https://192.168.56.121:6443]
    [bootstrap] Trying to connect to endpoint https://192.168.56.121:6443
    [bootstrap] Detected server version: v1.5.2
    [bootstrap] Successfully established connection with endpoint "https://192.168.56.121:6443"
    [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:
    Issuer: CN=kubernetes | Subject: CN=system:node:a1.kube0.example.com | CA: false
    Not before: 2017-01-27 05:50:00 +0000 UTC Not After: 2018-01-27 05:50:00 +0000 UTC
    [csr] Generating kubelet configuration
    [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.
  6. Workerノードの参加状況を確認します。
    $ kubectl get node
    NAME                   STATUS         AGE
    a1.kube0.example.com   Ready          2m
    m1.kube0.example.com   Ready,master   7m

プロセス一覧

  1. Masterノード
    1. [alice@m1 ~]$ pstree -uA
    2. systemd-+-NetworkManager-+-dhclient
    3.         |                `-2*[{NetworkManager}]
    4.         |-agetty
    5.         |-auditd---{auditd}
    6.         |-crond
    7.         |-dbus-daemon(dbus)
    8.         |-docker-+-docker-containe-+-9*[docker-containe-+-pause]
    9.         |        |                 |                    `-7*[{docker-containe}]]
    10.         |        |                 |-docker-containe-+-etcd---8*[{etcd}]
    11.         |        |                 |                 `-7*[{docker-containe}]
    12.         |        |                 |-docker-containe-+-kube-apiserver---5*[{kube-apiserver}]
    13.         |        |                 |                 `-7*[{docker-containe}]
    14.         |        |                 |-docker-containe-+-kube-scheduler---5*[{kube-scheduler}]
    15.         |        |                 |                 `-7*[{docker-containe}]
    16.         |        |                 |-docker-containe-+-kube-controller---5*[{kube-controller}]
    17.         |        |                 |                 `-7*[{docker-containe}]
    18.         |        |                 |-3*[docker-containe-+-pause]
    19.         |        |                 |                    `-8*[{docker-containe}]]
    20.         |        |                 |-docker-containe-+-sh---etcd---8*[{etcd}]
    21.         |        |                 |                 `-7*[{docker-containe}]
    22.         |        |                 |-docker-containe-+-kube-proxy---6*[{kube-proxy}]
    23.         |        |                 |                 `-7*[{docker-containe}]
    24.         |        |                 |-docker-containe-+-kube-discovery---3*[{kube-discovery}]
    25.         |        |                 |                 `-7*[{docker-containe}]
    26.         |        |                 |-docker-containe-+-controller---controller---3*[{controller}]
    27.         |        |                 |                 `-8*[{docker-containe}]
    28.         |        |                 |-docker-containe-+-install-cni.sh---sleep
    29.         |        |                 |                 `-7*[{docker-containe}]
    30.         |        |                 |-docker-containe-+-runsvdir-+-runsv---calico-felix-+-calico-iptables---calico-iptables---{calico-iptables}
    31.         |        |                 |                 |          |                      `-11*[{calico-felix}]
    32.         |        |                 |                 |          |-runsv---bird
    33.         |        |                 |                 |          |-runsv---bird6
    34.         |        |                 |                 |          `-runsv---confd---5*[{confd}]
    35.         |        |                 |                 `-7*[{docker-containe}]
    36.         |        |                 |-docker-containe-+-exechealthz-+-2*[sh---nslookup]
    37.         |        |                 |                 |             `-7*[{exechealthz}]
    38.         |        |                 |                 `-7*[{docker-containe}]
    39.         |        |                 `-8*[{docker-containe}]
    40.         |        `-60*[{docker}]
    41.         |-irqbalance
    42.         |-kubelet-+-journalctl
    43.         |         `-14*[{kubelet}]
    44.         |-lvmetad
    45.         |-master-+-pickup(postfix)
    46.         |        `-qmgr(postfix)
    47.         |-polkitd(polkitd)---5*[{polkitd}]
    48.         |-rsyslogd---2*[{rsyslogd}]
    49.         |-sshd---sshd---sshd(alice)---bash---pstree
    50.         |-systemd-journal
    51.         |-systemd-logind
    52.         |-systemd-udevd
    53.         `-tuned---4*[{tuned}]
  2. Workerノード
    1. [alice@a1 ~]$ pstree -uA
    2. systemd-+-NetworkManager-+-dhclient
    3.         |                `-2*[{NetworkManager}]
    4.         |-agetty
    5.         |-auditd---{auditd}
    6.         |-crond
    7.         |-dbus-daemon(dbus)
    8.         |-docker-+-docker-containe-+-2*[docker-containe-+-pause]
    9.         |        |                 |                    `-7*[{docker-containe}]]
    10.         |        |                 |-docker-containe-+-kube-proxy---7*[{kube-proxy}]
    11.         |        |                 |                 `-7*[{docker-containe}]
    12.         |        |                 |-docker-containe-+-install-cni.sh---sleep
    13.         |        |                 |                 `-7*[{docker-containe}]
    14.         |        |                 `-8*[{docker-containe}]
    15.         |        `-18*[{docker}]
    16.         |-irqbalance
    17.         |-kubelet-+-journalctl
    18.         |         `-12*[{kubelet}]
    19.         |-lvmetad
    20.         |-master-+-pickup(postfix)
    21.         |        `-qmgr(postfix)
    22.         |-polkitd(polkitd)---5*[{polkitd}]
    23.         |-rsyslogd---2*[{rsyslogd}]
    24.         |-sshd---sshd---sshd(alice)---bash---pstree
    25.         |-systemd-journal
    26.         |-systemd-logind
    27.         |-systemd-udevd
    28.         `-tuned---4*[{tuned}]

in コンテナ

  • Linux Container(LXD/LXC)内でもKubernetesを動作させることが可能です。
  1. KubernetesInLXD
  2. KubernetesInLXC

制限事項

ユーザ名前空間が有効なDocker上では動作しない

  • Dockerのユーザ名前空間機能*1を有効にした(--userns-remap)一般的な意味での非特権コンテナ上では、以下のようなエラーによりKubernetesの各サービスが起動できないため、クラスタは動作しません。lightbulb.pngKubernetesの場合、Docker側ではなくKubernetes側の Security Context によりPodおよびコンテナのセキュリティを担保するようです。これはクラスタセットアップ時点でのセキュアなコンテナ実行環境を保証しませんので、オペレータはこれらのセキュリティ機構に精通し、適切なセキュリティ設定をサービス毎に都度行う必要があります。Kubernetesの各サービスがrootによるDockerコンテナで動作している以上、その他のアプリケーションコンテナをrootで動作させることは推奨されないでしょう。
    • /var/log/messages
      1. Feb  8 21:48:17 m1 dockerd-current: time="2017-02-08T21:48:17.492644629+09:00" level=error
      2.  msg="Handler for POST /v1.24/containers/create returned error: Cannot share the host's network
      3.  namespace when user namespaces are enabled"
      4. Feb  8 21:48:17 m1 kubelet: E0208 21:48:17.493642    2405 docker_manager.go:2188] Failed to create
      5.  pod infra container: RunContainerError; Skipping pod "kube-scheduler-m1.kube0.example.com_kube-system
      6. (26530b16ff3bd27bc5af09fbfb82be3c)": runContainer: Error response from daemon: {"message":"Cannot
      7.  share the host's network namespace when user namespaces are enabled"}
      8. Feb  8 21:48:17 m1 kubelet: E0208 21:48:17.493749    2405 pod_workers.go:184] Error syncing pod
      9.  26530b16ff3bd27bc5af09fbfb82be3c, skipping: failed to "StartContainer" for "POD" with RunContainerError:
      10.  "runContainer: Error response from daemon: {\"message\":\"Cannot share the host's network namespace
      11.  when user namespaces are enabled\"}"
      12. ...
      13. Feb  8 21:48:17 m1 kubelet: E0208 21:48:17.585145    2405 docker_manager.go:2188] Failed to create
      14.  pod infra container: RunContainerError; Skipping pod "kube-controller-manager-m1.kube0.example.com_kube-system
      15. (9d71b000f85f1c25fabd2dd7e5ef4e97)": runContainer: Error response from daemon: {"message":"Cannot
      16.  share the host's network namespace when user namespaces are enabled"}
      17. Feb  8 21:48:17 m1 kubelet: E0208 21:48:17.585188    2405 pod_workers.go:184] Error syncing pod
      18.  9d71b000f85f1c25fabd2dd7e5ef4e97, skipping: failed to "StartContainer" for "POD" with RunContainerError:
      19.  "runContainer: Error response from daemon: {\"message\":\"Cannot share the host's network namespace
      20.  when user namespaces are enabled\"}"
      21. ...
      22. Feb  8 21:48:17 m1 kubelet: E0208 21:48:17.771626    2405 docker_manager.go:2188] Failed to create
      23.  pod infra container: RunContainerError; Skipping pod "etcd-m1.kube0.example.com_kube-system
      24. (3a26566bb004c61cd05382212e3f978f)": runContainer: Error response from daemon: {"message":"Cannot
      25.  share the host's network namespace when user namespaces are enabled"}
      26. ...
      27. Feb  8 21:48:17 m1 kubelet: E0208 21:48:17.886822    2405 docker_manager.go:2188] Failed to create
      28.  pod infra container: RunContainerError; Skipping pod "kube-apiserver-m1.kube0.example.com_kube-system
      29. (42bf509d1aa4e1ea806989e8f2f7d5af)": runContainer: Error response from daemon: {"message":"Cannot
      30.  share the host's network namespace when user namespaces are enabled"}

関連コンポーネント

  1. Istio

参考リソース

  1. https://kubernetes.io/

*1 Docker 1.10以上でサポート。デフォルトは無効、つまりホストのrootユーザがオーナーでコンテナが起動します。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-28 (水) 16:44:05 (142d)