这个快速入门向您展示了如何在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 |
准备
- 多台Ubuntu 16.04+、CentOS 7或HypriotOS v1.0.1 + 系统
- 每台机器最少1GB+内存
- 集群中所有机器之间网络连接正常
目标
- 在您的机器上安装一个安全的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集群的工具。
下一步
- 了解kubeadm在高级参考文档中的高级用法。
- 了解更多关于Kubernetes的概念和kubectl。
- 配置log rotation。请参考Configure and troubleshoot the Docker daemon。
版本偏差策略
版本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软件包和二进制文件。