使用kubeadm创建Kubernetes集群

这个快速入门向您展示了如何在Ubuntu 16.04+,CentOS 7或HypriotOS v1.0.1 +的机器上轻松安装Kubernetes群集。这次我们通过kubeadm工具来安装,它从1.4版本就被增加到k8s安装包。从v1.6开始,kubeadm可以通过RBAC等机制创建一个安全的集群。

此安装教程可以在本地虚拟机,物理服务器或云服务器上使用。也可以轻松地将kubeadn集成到自动化工具(Terraform,Chef,Puppet等)中。

有关所有kubeadm命令行行信息,以及有关自动化kubeadm建议,请参考官网原文kubeadm参考

  • 在GCE上,Google Container Engine 可以一键点击创建Kubernetes群集。
  • 在AWS上,kops使集群安装和管理更加方便。kops支持高可用性集群构建。

kubeadm Maturity

Aspect Maturity Level
Command line UX beta
Config file alpha
Selfhosting alpha
kubeadm alpha commands alpha
Implementation alpha

准备

  1. 多台Ubuntu 16.04+、CentOS 7或HypriotOS v1.0.1 + 系统
  2. 每台机器最少1GB+内存
  3. 集群中所有机器之间网络连接正常

目标

  • 在您的机器上安装一个安全的Kubernetes集群
  • 在群集上安装pod网络,以便应用组件(pod)可以相互通信
  • 在集群上安装一个微服务应用示例

步骤

(1/4)在主机上安装kubeadm

参考之前文章:安装 kubeadn 

(2/4)初始化 master

master 是控制组件运行的机器,包括etcd和API Server等(使用kubectl CLI与之通信启动)。

选择之前安装有kubeadm一台机器,运行以下命令来初始化master:

kubeadm init

注意:

  • - 你需要在下一步中选择一个Pod Network Plugin。
  • - 这将自动检测网络接口,并且将master节点上网卡设备设置成默认网关。如果要使用其他网卡设备,请执行kubeadm init命令增加--apiserver-advertise-address=<ip-address>参数。

kubeadm init命令执行完后需要几分钟时间下载集群控制组件。

请不要运行两次kubeadm init命令,除非从V1.6升级到v1.7,请参阅Tear Down

输出如下所示:

[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.7.0
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks
[preflight] Starting the kubelet service
[certificates] Generated CA certificate and key.
[certificates] Generated API server certificate and key.
[certificates] API Server serving cert is signed for DNS names [kubeadm-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.138.0.4]
[certificates] Generated API server kubelet client certificate and key.
[certificates] Generated service account token signing key and public key.
[certificates] Generated front-proxy CA certificate and key.
[certificates] Generated front-proxy client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"
[apiclient] Created API client, waiting for the control plane to become ready
[apiclient] All control plane components are healthy after 16.502136 seconds
[token] Using token: <token>
[apiconfig] Created RBAC rules
[addons] Applied essential addon: kube-proxy
[addons] Applied essential addon: kube-dns

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run (as a regular user):

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

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
as root:

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

创建kubeadm init输出的kubeadm join命令中,需要输入token参数。

token用于master节点和 joining nodes之间的相互认证。这里包含的token是secret,保证安全——通过token参数可以确保将被授权的节点添加到kubernetes集群中。可以使用kubeadm token命令listed、created和deleted这些token。

(3/4)安装pod网络

pod网络插件是必要安装,以便pod可以相互通信。

在部署应用和启动kube-dns之前,需要部署网络,kubeadm仅支持CNI的网络(不支持kubenet)。

网络插件完整列表,请参考 add-ons page

Kubernetes1.6的新功能: 在默认情况下,kubeadm 1.6建立了一个更安全的集群。因此,它使用RBAC向集群上运行的工作负载授予有限的权限。这包括集成网络。所以你需要确保网络系统已经更新为1.6。

使用以下命令安装pod网络插件:

kubectl apply -f <add-on.yaml>

注意:每个群集只能安装一种 pod网络。

第三方Pod Network Provider的安装说明。

1、Calico

Calico官方指南在这里

注意: - 为了使网络正常运行,执行kubeadm init命令时需要增加--pod-network-cidr=192.168.0.0/16参数-  Calico只适用amd64上工作。

kubectl apply -f http://docs.projectcalico.org/v2.4/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml

2、Canal

官方Canal设置指南在这里

注意: - 要使Canal正常工作,执行kubeadm init命令时需要增加--pod-network-cidr=10.244.0.0/16参数--。- Canal只适用amd64上工作。

kubectl apply -f https://raw.githubusercontent.com/projectcalico/canal/master/k8s-install/1.6/rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/projectcalico/canal/master/k8s-install/1.6/canal.yaml

3、Flannel

注意: - 为了使Flannel正常工作,执行kubeadm init命令时需要增加----pod-network-cidr=10.244.0.0/16参数。-Flannel适用于amd64,arm,arm64和ppc64le上工作,但使用除amd64平台得其他平台,你必须手动下载并替换amd64。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel-rbac.yml

4、Romana

Romana官方指南在这里

注意: Romana只适用amd64上工作。

kubectl apply -f https://raw.githubusercontent.com/romana/romana/master/containerize/specs/romana-kubeadm.yml

5、Weave Net

Weave Net官方设置指南在这里

注:Weave Net适用arm和arm64上工作。

export kubever=$(kubectl version | base64 | tr -d '\n')
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

pod网络安装完成后,需要检查kube-dns pod是否运行,通过命令kubectl get pods --all-namespaces的输出来确认网络是否正常工作。

如果网络不工作或者kube-dns未处于运行状态,请查看故障排除部分

Master 隔离

默认情况下,由于安全原因,集群不会将pod安排在Master服务器上。如果你希望能够将pod放到Master服务器上,例如,单机Kubernetes集群用于开发,请运行:

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

输出:

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

(4/4)加工作节点

要为群集添加工作节点,请为每台计算机执行以下操作:

  • SSH到机器
  • 成为root用户
  • 运行输出的命令kubeadm init。例如:
    kubeadm join --token <token> <master-ip>:<master-port>
    

输出:

[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 "10.138.0.4:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://10.138.0.4:6443"
[discovery] Cluster info signature and contents are valid, will use API Server "https://10.138.0.4:6443"
[discovery] Successfully established connection with API Server "10.138.0.4:6443"
[bootstrap] Detected server version: v1.7.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.

几秒钟后,在master节点上运行kubectl get nodes命令,会显示所有已添加到集群中的节点主机。

(可选)在master以外的机器上控制集群

需要将kubeconfig文件从master节点上复制到工作节点,如下所示:

scp root@<master ip>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes

注意:如果使用GCE,默认情况下禁用ssh访问root,这种情况你需要登录到机器,将文件复制到可访问的地方,然后再使用 gcloud compute copy-files

(可选)Proxying API Server to localhost

如果要从群集外部连接到API Server,可以使用 kubectl proxy:

scp root@<master ip>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf proxy

你现在可以在本地访问API Server http://localhost:8001/api/v1

(可选)安装示例应用

Sock Shop是一个微服务应用示例,显示如何在Kubernetes上运行和连接一组服务。要了解微服务应用的更多信息,请参考GitHub README

注意,Sock Shop演示仅适用于amd64。

kubectl create namespace sock-shop
kubectl apply -n sock-shop -f "https://github.com/microservices-demo/microservices-demo/blob/master/deploy/kubernetes/complete-demo.yaml?raw=true"
kubectl -n sock-shop get svc front-end

示例输出:

NAME        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
front-end   10.110.250.153   <nodes>       80:30001/TCP   59s

下载并启动所有容器需要几分钟的时间,通过kubectl get pods -n sock-shop命令查看示例应用信息。

在浏览器通过http://<master_ip>:<port>访问,需要指定端口和Master节点IP地址,本例端口30001,IP 10.110.250.153 。

如果有防火墙,请确保该端口能够使用访问。

卸载socks shop,在master上运行命令:kubectl delete namespace sock-shop。

卸载

要卸载kubeadm功能。

运行:

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

然后,在要删除的节点上,重置所有kubeadm安装状态:

kubeadm reset

升级

有关kubeadm群集升级说明可在这里找到 。

查看其他插件

请参考list of add-ons,以查看其他插件,包括日志,监控,网络策略,可视化和控制Kubernetes集群的工具。

下一步

版本偏差策略

版本vX.Y的kubeadm CLI工具可以部署具有版本vX.Y或vX。(Y-1)的群集。kubeadm CLI vX.Y还可以升级现有的kubeadm创建的版本vX。(Y-1)。

以后未来情况:kubeadm CLI vX.Y可以或无法部署vX。(Y + 1)集群。

示例:kubeadm v1.7可以部署v1.6和v1.7群集,并将v1.6 kubeadm创建的群集升级到v1.7。

kubeadm 多平台

可以使用针对amd64,arm(32位),arm64,ppc64le和s390x构建kubeadm deb / rpm软件包和二进制文件。