使用 kubeadm 创建一个 kubernetes 集群
【福利】赠书活动仍在继续中:《大话代码架构》
简介
kubeadm
是一个 kubernetes
官方提供的快速安装和初始化拥有最佳实践(best practice)的 kubernetes
集群的工具,虽然目前还处于 beta 和 alpha 状态,还不能用在生产环境,但是我们可以通过学习这种部署方法来体会一些官方推荐的kubernetes最佳实践的设计和思想。
kubeadm
的目标是提供一个最小可用的可以通过 Kubernetes一致性测试
的集群,所以并不会安装任何除此之外的非必须的addon。
kubeadm
默认情况下并不会安装一个网络解决方案,所以用 kubeadm
安装完之后 需要自己来安装一个网络的插件。
使用
系统环境
kubeadm
支持多种系统,这里简单介绍一下需要的系统要求:
Ubuntu16.04+ / Debian 9 / CentOS 7 / RHEL 7 / Fedora 25/26(best-effort) / HypriotOS v1.0.1+ / Other
2GB或者以上的RAM(否则将没有足够空间留给app)
2核以上CPU
集群的机器之间必须能通过网络互相通信
SWAP必须被关闭,否则kubelet会出错!
具体的详细信息可以在官方网站上看到。
本篇内容基于aws的ap-northeast-1的ec2, CentOS7
的操作系统(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
把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
, kubelet
和 kubectl
。
切记:kubeadm不会自动去安装和管理 kubelet和kubectl,所以需要自己去确保安装的版本和你想要安装的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
, kubelet
和 kubectl
了,我们需要先加一个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和其它控制组件等。
界面差不多如下:
最下面的这行 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
, WeaveNet
等。这里我们使用 Flannel
。
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
安装完network之后,你可以通过 kubectlgetpods--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
输出差不多如下图:
这时候,我们去master上输入 kubectlgetnodes
查看一下:
[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)
原文:https://purewhite.io/2017/12/17/use-kubeadm-setup-k8s/
推荐阅读
长按指纹
一键关注
点击 “阅读原文” 看看本号其他精彩内容
使用 kubeadm 创建一个 kubernetes 集群相关推荐
- 云图说 | 快速创建一个kubernetes集群
随着应用程序开发向基于容器的方向发展,编排和管理资源的需求变得越来越重要.Kubernetes是一个开源的.功能强大的容器编排系统,用于管理容器化应用和服务,它提供了应用部署.规划.更新.维护的一种机 ...
- 如何部署一个Kubernetes集群
来源 | 无敌码农 责编 | 寇雪芹 头图 | 下载于视觉中国 在上一篇文章<Kubernetes和Docker的关系是什么?>中,和大家分享了关于Kubernetes的基本系统架构以及关 ...
- ② kubeadm快速部署Kubernetes集群
文章目录 1. 安装要求 2. 目标 3. 准备环境 4. 所有节点安装Docker/kubeadm/kubelet 4.1 安装Docker(以一台为例,其他相同) 4.2 添加kubernetes ...
- 使用kubeadm部署一个K8s集群
1.前言 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: 2. 安装要求 一台或多台机器,操作系统 Ce ...
- (三)在Azure上创建您的第一个Kubernetes集群
目录 Azure Kubernetes服务 Azure资源管理器 先决条件和清理 AKS群集模板 Azure DevOps管道 下一步 在本系列的前面部分,我们使用Azure Functions创建了 ...
- 【k8s记录系列】实操kubeadm安装部署Kubernetes集群全过程 V1.20.5
首先感谢王跃辉我辉哥提供的技术支持,嘿嘿! 准备工具:VMware(已经启动好三台Linux服务器Centos7.x版本),远程连接工具putty,xshell等 如果还没有安装虚拟机,或者不知道怎么 ...
- 如何专业化监控一个Kubernetes集群?
简介:本文会介绍 Kubernetes 可观测性系统的构建,以及基于阿里云云产品实现 Kubernetes 可观测系统构建的最佳实践. 作者:佳旭 阿里云容器服务技术专家 引言 Kubernetes ...
- (一)在GKE上创建MLOps Kubernetes集群
目录 Kubernetes简述 设置GKE集群 启动GKE集群 创建secrets.yaml文件 下一步 在之前的系列文章中,我们讨论了在一组Docker容器中作为CI/CD MLOps管道的一部分 ...
- 如何专业化监控一个 Kubernetes 集群?
引言 Kubernetes 在生产环境应用的普及度越来越广.复杂度越来越高,随之而来的稳定性保障挑战也越来越大. 如何构建全面深入的可观测性架构和体系,是提升系统稳定性的关键之因素一.ACK将可观测性 ...
最新文章
- Python基础08-数据类型:集合set
- leetcode--买股票的最佳时机II--python
- React 组件之间传递参数
- 《Splunk智能运维实战》——3.11 制作折线图显示项目浏览量和购买量随时间的变化...
- golang beego orm mysql sqlite3 postgresql 模型字段 数据库类型 对应关系
- 问题: 将N个元素使用push_back插入到vector中, 求push_back操作的复杂度。
- 系统架构师学习笔记-面向对象方法
- 机器学习13/100天-SVM实践
- 报错 ERROR in static/js/vendor.b3f56e9e0cd56988d890.js from UglifyJs
- 无继承情况下的对象构造
- Funcode学习笔记:写一个维护性高、扩展性强的框架【By Myself】【C++】
- win2008 用什么php,Win2008 Server配置PHP环境,win2008php
- 使用html5+canvas+Jquery实现的纯代码连线题Demo
- 微服务测试:如何破解测试所面临的问题?测试的类型和范围你懂吗
- window10计算机策略,如何打开组策略,教您win10如何打开组策略
- Java自己编名字的百家姓罗列
- mysql的外文图书_外文数据库
- ECMAScript标准命名
- 谷歌SEO专业术语指南
- 【新番尝鲜】秀逗魔导士E-revolution——罪名:莉娜*因巴斯
热门文章
- linux ubuntu kubuntu与xubuntu等各版本差别
- ATTCK框架简介 已知攻击技术汇总
- 使用 GetStartupInfo 检查自己是否被调试
- TCP/IP详解--学习笔记(8)-DNS域名系统
- 解决Ubuntu中sublime无法输入中文的问题
- c++内存对齐的规则
- hyper-v创建虚拟服务器,使用 Hyper-V 创建虚拟机
- 推送通知_手机总是收到烦人的推送,教你几招,彻底摆脱无用通知
- vue父组件ajax改变数据,vue父组件传了变量给子组件,改变子组件的对象时,父组件也跟着改变...
- 微软软件推送服务器,向 UWP 应用添加推送通知 - Azure Mobile Apps | Microsoft Docs