这个快速入门向您展示了如何在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:

  1. kubeadm init

注意:

    • 你需要在下一步中选择一个Pod Network Plugin。
    • 这将自动检测网络接口,并且将master节点上网卡设备设置成默认网关。如果要使用其他网卡设备,请执行kubeadm init命令增加—apiserver-advertise-address=参数。
      kubeadm init命令执行完后需要几分钟时间下载集群控制组件。

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

输出如下所示:

  1. [kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
  2. [init] Using Kubernetes version: v1.7.0
  3. [init] Using Authorization modes: [Node RBAC]
  4. [preflight] Running pre-flight checks
  5. [preflight] Starting the kubelet service
  6. [certificates] Generated CA certificate and key.
  7. [certificates] Generated API server certificate and key.
  8. [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]
  9. [certificates] Generated API server kubelet client certificate and key.
  10. [certificates] Generated service account token signing key and public key.
  11. [certificates] Generated front-proxy CA certificate and key.
  12. [certificates] Generated front-proxy client certificate and key.
  13. [certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
  14. [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
  15. [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
  16. [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
  17. [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"
  18. [apiclient] Created API client, waiting for the control plane to become ready
  19. [apiclient] All control plane components are healthy after 16.502136 seconds
  20. [token] Using token: <token>
  21. [apiconfig] Created RBAC rules
  22. [addons] Applied essential addon: kube-proxy
  23. [addons] Applied essential addon: kube-dns
  24.  
  25. Your Kubernetes master has initialized successfully!
  26.  
  27. To start using your cluster, you need to run (as a regular user):
  28.  
  29. mkdir -p $HOME/.kube
  30. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  31. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  32.  
  33. You should now deploy a pod network to the cluster.
  34. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  35. http://kubernetes.io/docs/admin/addons/
  36.  
  37. You can now join any number of machines by running the following on each node
  38. as root:
  39.  
  40. 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网络插件:

  1. 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上工作。

  1. 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上工作。

  1. kubectl apply -f https://raw.githubusercontent.com/projectcalico/canal/master/k8s-install/1.6/rbac.yaml
  2. 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。

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

4、Romana

Romana官方指南在这里

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

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

5、Weave Net

Weave Net官方设置指南在这里

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

  1. export kubever=$(kubectl version | base64 | tr -d '\n')
  2. 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集群用于开发,请运行:

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

输出:

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

(4/4)加工作节点

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

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

输出:

  1. [kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
  2. [preflight] Running pre-flight checks
  3. [discovery] Trying to connect to API Server "10.138.0.4:6443"
  4. [discovery] Created cluster-info discovery client, requesting info from "https://10.138.0.4:6443"
  5. [discovery] Cluster info signature and contents are valid, will use API Server "https://10.138.0.4:6443"
  6. [discovery] Successfully established connection with API Server "10.138.0.4:6443"
  7. [bootstrap] Detected server version: v1.7.0
  8. [bootstrap] The server supports the Certificates API (certificates.k8s.io/v1beta1)
  9. [csr] Created API client to obtain unique certificate for this node, generating keys and certificate signing request
  10. [csr] Received signed certificate from the API server, generating KubeConfig...
  11. [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
  12.  
  13. Node join complete:
  14. * Certificate signing request sent to master and response
  15. received.
  16. * Kubelet informed of new secure connection details.
  17.  
  18. Run 'kubectl get nodes' on the master to see this machine join.

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

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

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

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

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

(可选)Proxying API Server to localhost

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

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

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

(可选)安装示例应用

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

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

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

示例输出:

  1. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  2. 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功能。

运行:

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

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

  1. 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软件包和二进制文件。

K8S中文社区微信公众号

原文: http://docs.kubernetes.org.cn/459.html