# 使用 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

# 准备

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

# 目标

  • 在您的机器上安装一个安全的 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>参数。

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
Last Updated: 4/15/2023, 8:33:17 PM