Kubernetes: kubeadm使集群建设变得简单

在Kubernetes 1.4中,引入了名为”kubeadm”的机制,用于大大简化Kubernetes集群的构建过程。

由于在1.4版本中,这是一个alpha功能,因此在正式环境中建立集群还需要等待将来的版本。

我按照手册在Google Compute Engine的虚拟机上进行了实际测试。

概要:简述。

通过以下四个步骤,我们可以轻松创建Kubernetes集群(类似于Docker的swarm join/init):

    1. 関連パッケージのインストール

kubeadm initでマスターを初期化

kubeadm join –token xxxx yyy.yyy.yyy.yyyでワーカーを追加
Podネットワークのデプロイ

これでクラスタの構築が完了します。

备战

我在GCP上创建了以下的虚拟机:3台(Master*1,Worker*2)。

マシンタイプ: n1-standard-1

OS: Ubuntu 16.04 LTS(amd64 xenial image built on 2016-09-30)

首先,您可以使用以下命令来安装所需的软件包。

sudo su -
curl 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 docker.io kubelet kubeadm kubectl kubernetes-cni

大师的设置

在Maste上只需要执行“kubeadm init”这一步。

Masterにログインし下記のようにkubeadm initを実行します。複数のIPアドレスがある場合は–api-advertise-addressesで公開するIPアドレスを指定する必要があります。

sudo kubeadm init

在不到一分钟的时间内,Kubernetes的主节点初始化完成。请记下显示出来的用于工作节点加入的命令。

<master/tokens> generated token: "59fd3a.744950d511c9cd4b"
<master/pki> created keys and certificates in "/etc/kubernetes/pki"
<util/kubeconfig> created "/etc/kubernetes/kubelet.conf"
<util/kubeconfig> created "/etc/kubernetes/admin.conf"
<master/apiclient> created API client configuration
<master/apiclient> created API client, waiting for the control plane to become ready
<master/apiclient> all control plane components are healthy after 26.083726 seconds
<master/apiclient> waiting for at least one node to register and become ready
<master/apiclient> first node is ready after 5.002739 seconds
<master/discovery> created essential addon: kube-discovery, waiting for it to become ready
<master/discovery> kube-discovery is ready after 10.002818 seconds
<master/addons> created essential addon: kube-proxy
<master/addons> created essential addon: kube-dns
Kubernetes master initialised successfully!
You can now join any number of machines by running the following on each node:

# worker用のコマンドが表示される
kubeadm join --token 59fd3a.744950d511c9cd4b 10.240.0.5

在/etc/kubernetes文件夹下生成了以下类似的文件。证书等也会自动生成,非常棒。

# 証明書
/etc/kubernetes/pki/apiserver-key.pem
/etc/kubernetes/pki/ca.pem
/etc/kubernetes/pki/apiserver-pub.pem
/etc/kubernetes/pki/ca-pub.pem
/etc/kubernetes/pki/tokens.csv
/etc/kubernetes/pki/sa-pub.pem
/etc/kubernetes/pki/apiserver.pem
/etc/kubernetes/pki/sa-key.pem
/etc/kubernetes/pki/ca-key.pem
# Masterコンポーネントの設定
/etc/kubernetes/manifests/kube-scheduler.json
/etc/kubernetes/manifests/kube-controller-manager.json
/etc/kubernetes/manifests/kube-apiserver.json
/etc/kubernetes/manifests/etcd.json
# kubeletの設定
/etc/kubernetes/admin.conf
/etc/kubernetes/kubelet.conf

kubelet启动如下,Kubernetes的Master组件(调度器、控制器、API服务器、etcd等)以容器形式启动。

/usr/bin/kubelet \
  --kubeconfig=/etc/kubernetes/kubelet.conf \
  --require-kubeconfig=true \
  --pod-manifest-path=/etc/kubernetes/manifests \
  --allow-privileged=true \
  --network-plugin=cni \
  --cni-conf-dir=/etc/cni/net.d \
  --cni-bin-dir=/opt/cni/bin \
  --cluster-dns=100.64.0.10 \
  --cluster-domain=cluster.local \
  --v=4

工人的配置

Workerにログインし、kubeadm initで表示されたコマンドでworker用VMで実行します。

sudo kubeadm join --token 59fd3a.744950d511c9cd4b 10.240.0.5

下面的示例展示了节点的快速添加过程。非常简单。

<util/tokens> validating provided token
<node/discovery> created cluster info discovery client, requesting info from "http://10.240.0.5:9898/cluster-info/v1/?token-id=59fd3a"
<node/discovery> cluster info object received, verifying signature using given token
<node/discovery> cluster info signature and contents are valid, will use API endpoints [https://10.240.0.5:443]

<node/csr> created API client to obtain unique certificate for this node, generating keys and certificate signing request
<node/csr> received signed certificate from the API server, generating kubelet configuration
<util/kubeconfig> created "/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.

第二台的操作步骤也是相同的。

当查看生成的/etc/kubernetes/kubelet.conf文件时,可以看到如下所示的配置已自动完成,包括凭据和API服务器等设置。(部分凭据已省略)

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0...Qo=
    server: https://10.240.0.5:443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubelet-kube-worker2
  name: kubelet-kube-worker2@kubernetes
current-context: kubelet-kube-worker2@kubernetes
kind: Config
preferences: {}
users:
- name: kubelet-kube-worker2
  user:
    client-certificate-data: LS0...o=
    client-key-data: LS0t...o=

kubelet会启动如下所示的内容,并且kube-proxy将在容器中启动。

/usr/bin/kubelet \
  --kubeconfig=/etc/kubernetes/kubelet.conf \
  --require-kubeconfig=true \
  --pod-manifest-path=/etc/kubernetes/manifests \
  --allow-privileged=true \
  --network-plugin=cni \
  --cni-conf-dir=/etc/cni/net.d \
  --cni-bin-dir=/opt/cni/bin \
  --cluster-dns=100.64.0.10 \
  --cluster-domain=cluster.local \
  --v=4

在Master端进行确认并配置Pod网络。

我会登录到Master并检查是否已添加了节点。

kubectl get nodes

您可以确认以下内容已添加了”Node”。

NAME           STATUS    AGE
kube-master    Ready     5m
kube-worker1   Ready     4m
kube-worker2   Ready     3m

最后进行Pod网络的安装。可以选择几个Pod网络,这里选择了Weave Net,按照手册上的说明。目前还可以选择Canal和Calico (参考: 网络和网络策略)。

kubectl apply -f https://raw.githubusercontent.com/weaveworks/weave-kube/master/weave-daemonset.yaml

在这个时候,Pod是这样的。

kubectl get pods --all-namespaces

NAMESPACE     NAME                                  READY     STATUS    RESTARTS   AGE
kube-system   etcd-kube-master                      1/1       Running   0          5m
kube-system   kube-apiserver-kube-master            1/1       Running   0          6m
kube-system   kube-controller-manager-kube-master   1/1       Running   0          6m
kube-system   kube-discovery-982812725-vr5or        1/1       Running   0          6m
kube-system   kube-dns-2247936740-qclp0             2/3       Running   0          6m
kube-system   kube-proxy-amd64-a6niu                1/1       Running   0          5m
kube-system   kube-proxy-amd64-cgqz5                1/1       Running   0          4m
kube-system   kube-proxy-amd64-mf3m7                1/1       Running   0          6m
kube-system   kube-scheduler-kube-master            1/1       Running   0          5m
kube-system   weave-net-kkipk                       2/2       Running   0          26s
kube-system   weave-net-xxtgw                       2/2       Running   0          26s
kube-system   weave-net-yyb64                       2/2       Running   0          26s

确认行动

為了進行操作確認,我們將部署一個樣本應用程式。這是一個很好的範例,以微服務的方式部署了含有超過10個的Pod,包括資料庫。

我将在Master上执行以下操作。

git clone https://github.com/microservices-demo/microservices-demo
kubectl apply -f microservices-demo/deploy/kubernetes/manifests

我要确认所有的 Pod 都已经处于运行状态。

kubectl get pods

NAME                           READY     STATUS    RESTARTS   AGE
cart-3694116665-ethb2          1/1       Running   0          20m
cart-db-2305146297-k860k       1/1       Running   0          20m
catalogue-11453786-gs9k9       1/1       Running   0          20m
catalogue-db-393939662-bx08x   1/1       Running   0          20m
front-end-3820830240-3pvn7     1/1       Running   0          20m
orders-3498886496-jymtz        1/1       Running   0          20m
orders-db-1775353731-bsfa4     1/1       Running   0          20m
payment-3012088042-e7xn6       1/1       Running   0          20m
queue-master-936560853-omntu   1/1       Running   0          20m
rabbitmq-1897447621-fhb8y      1/1       Running   0          20m
shipping-1232389217-7aqn7      1/1       Running   0          20m
user-3090014237-y64z3          1/1       Running   0          20m
user-db-1338754314-q7mv9       1/1       Running   0          20m

为了通过NodePort访问示例应用程序,查看Service的信息。

kubectl describe svc front-end

Name:                   front-end
Namespace:              default
Labels:                 name=front-end
Selector:               name=front-end
Type:                   NodePort
IP:                     100.69.60.103
Port:                   <unset> 80/TCP
NodePort:               <unset> 31992/TCP # このPortを使う
Endpoints:              10.38.0.3:8079
Session Affinity:       None

使用NodePort来访问。为了省去端口开放的麻烦,在本地进行SSH端口转发。(NodePort每次都会改变,此次为31992)

ssh -L 31992:127.0.0.1:31992 <ユーザ名>@<VMのPublic IP>

我已经确认能够访问 http://localhost:31992/,并且能够正常运行以下示例网络应用程序。

image

限制

目前的情况如下,与手册中所述的限制相同。

    • cloud-providerを設定できない

Persistent VolumeやLoad Balancerなどの機能が使えない

1台のMasterしか作れない

kubectl logsが動かない

kubectl用のkubeconfigが簡単に取得できない

ひとまずMasterの/etc/kubernetes/admin.confをコピーしてくる方法がある

提供的信息

    • 公式のマニュアル

http://kubernetes.io/docs/getting-started-guides/kubeadm/

kubeadmのソースコード

https://github.com/kubernetes/kubernetes/tree/master/cmd/kubeadm

广告
将在 10 秒后关闭
bannerAds