使用 kubeadm 创建一个 kubernetes 集群

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: kubeadm 是一个 kubernetes 官方提供的快速安装和初始化拥有最佳实践(best practice)的 kubernetes 集群的工具,虽然目前还处于 beta 和 alpha 状态,还不能用在生产环境,但是我们可以通过学习这种部署方法来体会一些官方推荐的kubernetes最佳实践的设计和思想。

简介

kubeadm是一个kubernetes官方提供的快速安装和初始化拥有最佳实践(best practice)kubernetes集群的工具,虽然目前还处于 beta 和 alpha 状态,还不能用在生产环境,但是我们可以通过学习这种部署方法来体会一些官方推荐的kubernetes最佳实践的设计和思想。

kubeadm的目标是提供一个最小可用的可以通过Kubernetes一致性测试的集群,所以并不会安装任何除此之外的非必须的addon。

kubeadm默认情况下并不会安装一个网络解决方案,所以用kubeadm安装完之后 需要自己来安装一个网络的插件。

使用

系统环境

kubeadm支持多种系统,这里简单介绍一下需要的系统要求:

  1. Ubuntu16.04+ / Debian 9 / CentOS 7 / RHEL 7 / Fedora 25/26(best-effort) / HypriotOS v1.0.1+ / Other
  2. 2GB或者以上的RAM(否则将没有足够空间留给app)
  3. 2核以上CPU
  4. 集群的机器之间必须能通过网络互相通信
  5. SWAP必须被关闭,否则kubelet会出错!

具体的详细信息可以在官方网站上看到。

本篇内容基于aws的ap-northeast-1的ec2,CentOS 7 的操作系统(ami-4dd5522b),实例类型t2.medium 2核4GB,3台机器,1 master,2 nodes,kubernetes 1.9 版本。为了方便起见,在安全组里面打开了所有的端口和IP访问。

机器配置:

[centos@ip-172-31-24-49 ~]$ uname -a
Linux ip-172-31-24-49.ap-northeast-1.compute.internal 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

首先 ,我们关闭selinux:

$ sudo vim /etc/sysconfig/selinux

91C23F22-58A4-4F03-842F-97018D78F9D8

把SELINUX改成disabled,然后保存退出。

在我用的ami中,swap是默认关闭的,所以不需要我手动关闭,大家需要确认 自己的环境中swap是否有关闭掉,否则会在之后的环节中出问题。

为了方便我们安装,我们将sshd设置为keepalive:

$ sudo -i
$ echo "ClientAliveInterval 10" >> /etc/ssh/sshd_config
$ echo "TCPKeepAlive yes" >> /etc/ssh/sshd_config
$ systemctl restart sshd.service

接下来我们重启一下机器:

$ sudo sync
$ sudo reboot

至此,准备阶段结束。

安装kubeadm

首先,我们需要在所有机器上都安装docker, kubeadm, kubeletkubectl

切记:kubeadm不会自动去安装和管理 kubeletkubectl,所以需要自己去确保安装的版本和你想要安装的kubernetes版本相同。

安装docker

$ sudo yum install -y docker
$ sudo systemctl enable docker && sudo systemctl start docker

在RHEL/CentOS 7 系统上可能会路由失败,我们需要设置一下:

$ sudo -i
$ cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system

接下来我们需要安装kubeadm, kubeletkubectl了,我们需要先加一个repo:

$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

然后安装:

$ sudo yum install -y kubelet kubeadm kubectl
$ sudo systemctl enable kubelet && sudo systemctl start kubelet

至此,在所有机器上安装所需的软件已经结束。

使用kubeadm初始化master

安装完所有的依赖之后,我们就可以用kubeadm初始化master了。

最简单的初始化方法是:

$ kubeadm init

除此之外,kubeadm还支持多种方法来配置,具体可以查看一下官方文档。

我们在初始化的时候指定一下kubernetes版本,并设置一下pod-network-cidr(后面的flannel会用到):

$ sudo -i
$ kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

在这个过程中kubeadm执行了一系列的操作,包括一些pre-check,生成ca证书,安装etcd和其它控制组件等。

界面差不多如下:

2256534A-2144-4118-843C-7179EF34EC49

最下面的这行kubeadm join什么的,就是用来让别的node加入集群的,可以看出非常方便。我们要保存好这一行东西,这是我们之后让node加入集群的凭据,一会儿会用到。

这个时候,我们还不能通过kubectl来控制集群,要让kubectl可用,我们需要做:

# 对于非root用户
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 对于root用户
$ export KUBECONFIG=/etc/kubernetes/admin.conf
# 也可以直接放到~/.bash_profile
$ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

接下来要注意,我们必须自己来安装一个network addon。

network addon必须在任何app部署之前安装好。同样的,kube-dns也会在network addon安装好之后才启动。kubeadm只支持CNI-based networks(不支持kubenet)。

比较常见的network addon有:Calico, Canal, Flannel, Kube-router, Romana, Weave Net等。这里我们使用Flannel

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

安装完network之后,你可以通过kubectl get pods --all-namespaces来查看kube-dns是否在running来判断network是否安装成功。

默认情况下,为了保证master的安全,master是不会被调度到app的。你可以取消这个限制通过输入:

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

加入nodes

终于部署完了我们的master!

现在我们开始加入一些node到我们的集群里面吧!

ssh到我们的node节点上,执行刚才下面给出的那个 kubeadm join的命令(每个人不同):

$ sudo -i
$ kubeadm join --token 72a8a4.2ed9076cd668b8b7 172.31.31.60:6443 --discovery-token-ca-cert-hash sha256:f0894e55d475f882dd40d52c6d01f758017ec5729be632294049f687330f60d2

输出差不多如下图:

1E93FFDE-F0FE-4C7B-9207-6B8DF3EE7787

这时候,我们去master上输入kubectl get nodes查看一下:

[root@i-071abd86ed304dc84 ~]# kubectl get nodes
NAME                  STATUS    ROLES     AGE       VERSION
i-071abd86ed304dc84   Ready     master    12m       v1.9.0
i-0c559ad3c0b16fd36   Ready     <none>    1m        v1.9.0
i-0f3f7462b0a004b5e   Ready     <none>    47s       v1.9.0

成功!

总结

我们可以看到,用kubeadm部署可以让我们比手动部署方便得多,虽然比不上kops这样的一键部署生产Kubernetes集群的工具,但是kubeadm最初的设计也并非是傻瓜式使用。

kubeadm给了用户很多的灵活性,让用户可以完全自定义地去配置自己的集群。

不过目前(截止博客发布为止),kubeadm还只是在测试,官方还不建议在生产环境中使用,不过预计会在2018年春季可以投入生产使用。

最后,我们总结一下kubeadm最核心的几个概念:

  • 官方认为的 最佳实践(best-practice)
  • 合理的安全(reasonably secure)
  • 可扩展(extensible)
  • 最小可用(minimum viable)
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
18天前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
118 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
18天前
|
存储 Kubernetes 测试技术
k8s使用pvc,pv,sc关联ceph集群
文章介绍了如何在Kubernetes中使用PersistentVolumeClaim (PVC)、PersistentVolume (PV) 和StorageClass (SC) 来关联Ceph集群,包括创建Ceph镜像、配置访问密钥、删除默认存储类、编写和应用资源清单、创建资源以及进行访问测试的步骤。同时,还提供了如何使用RBD动态存储类来关联Ceph集群的指南。
36 7
|
18天前
|
存储 Kubernetes 数据安全/隐私保护
k8s对接ceph集群的分布式文件系统CephFS
文章介绍了如何在Kubernetes集群中使用CephFS作为持久化存储,包括通过secretFile和secretRef两种方式进行认证和配置。
25 5
|
18天前
|
Kubernetes Ubuntu 网络安全
Ubuntu基于kubeadm快速部署K8S实战
关于如何在Ubuntu系统上使用kubeadm工具快速部署Kubernetes集群的详细实战指南。
72 2
|
18天前
|
Kubernetes 负载均衡 应用服务中间件
kubeadm快速构建K8S1.28.1高可用集群
关于如何使用kubeadm快速构建Kubernetes 1.28.1高可用集群的详细教程。
36 2
|
27天前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
|
27天前
|
存储 Kubernetes Go
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
|
18天前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
40 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
22天前
|
运维 Kubernetes Cloud Native
云原生之旅:Kubernetes 集群的搭建与实践Python 编程入门:从零基础到编写实用脚本
【8月更文挑战第30天】在数字化转型的大潮中,云原生技术以其弹性、可扩展性及高效运维能力成为企业IT架构升级的关键。本文将通过实际操作演示如何在本地环境搭建一个简易的Kubernetes集群,带你领略云原生的魅力所在。从集群规划到服务部署,每一步都是对云原生理念的深刻理解和应用。让我们共同探索,如何通过Kubernetes集群的搭建和运维,提升业务灵活性和创新能力。
|
18天前
|
Kubernetes Linux API
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
该博客文章详细介绍了在CentOS 7.6操作系统上使用kubeadm工具部署kubernetes 1.17.2版本的测试集群的过程,包括主机环境准备、安装Docker、配置kubelet、初始化集群、添加节点、部署网络插件以及配置k8s node节点管理api server服务器。
53 0
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇