Kubernetes: kubeadm使集群建设变得简单
在Kubernetes 1.4中,引入了名为”kubeadm”的机制,用于大大简化Kubernetes集群的构建过程。
由于在1.4版本中,这是一个alpha功能,因此在正式环境中建立集群还需要等待将来的版本。
我按照手册在Google Compute Engine的虚拟机上进行了实际测试。
概要:简述。
通过以下四个步骤,我们可以轻松创建Kubernetes集群(类似于Docker的swarm join/init):
-
- 関連パッケージのインストール
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/,并且能够正常运行以下示例网络应用程序。
限制
目前的情况如下,与手册中所述的限制相同。
-
- 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