# 使用 kubeadm 创建 k8s 集群
这个快速入门向您展示了如何在 Ubuntu 16.04+,CentOS 7 或 HypriotOS v1.0.1 +的机器上轻松安装 k8s 群集。这次我们通过 kubeadm 工具来安装,它从 1.4 版本就被增加到 k8s 安装包。从 v1.6 开始,kubeadm 可以通过 RBAC 等机制创建一个安全的集群。
此安装教程可以在本地虚拟机,物理服务器或云服务器上使用。也可以轻松地将 kubeadn 集成到自动化工具(Terraform,Chef,Puppet 等)中。
有关所有 kubeadm 命令行行信息,以及有关自动化 kubeadm 建议,请参考官网原文 kubeadm 参考。
- 在 GCE 上,Google Container Engine 可以一键点击创建 k8s 群集。
- 在 AWS 上,kops 使集群安装和管理更加方便。kops 支持高可用性集群构建。
kubeadm Maturity
Aspect | Maturity Level |
---|---|
Command line UX | beta |
Config file | alpha |
Selfhosting | alpha |
kubeadm alpha commands | alpha |
Implementation | alpha |
# 准备
- 多台 Ubuntu 16.04+、CentOS 7 或 HypriotOS v1.0.1 + 系统
- 每台机器最少 1GB+内存
- 集群中所有机器之间网络连接正常
# 目标
- 在您的机器上安装一个安全的 k8s 集群
- 在群集上安装 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>
参数。
- 这将自动检测网络接口,并且将 master 节点上网卡设备设置成默认网关。如果要使用其他网卡设备,请执行 kubeadm init 命令增加
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 参数可以确保将被授权的节点添加到 k8s 集群中。可以使用 kubeadm token 命令 listed、created 和 deleted 这些 token。
# (3/4)安装 pod 网络
pod 网络插件是必要安装,以便 pod 可以相互通信。
在部署应用和启动 kube-dns 之前,需要部署网络,kubeadm 仅支持 CNI 的网络(不支持 kubenet)。
网络插件完整列表,请参考 add-ons page。
k8s1.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 服务器上,例如,单机 k8s 集群用于开发,请运行:
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 是一个微服务应用示例,显示如何在 k8s 上运行和连接一组服务。要了解微服务应用的更多信息,请参考 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