使用 kubeadm 创建 kubernetes 1.9 集群
简介
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,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
把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
, 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
这时候,我们去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)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
[译]Kube Router Documentation
体系结构 Kube路由器是围绕观察者和控制器的概念而建立的。 观察者使用Kubernetes监视API来获取与创建,更新和删除Kubernetes对象有关的事件的通知。 每个观察者获取与特定API对象相关的通知。 在从API服务器接收事件时,观察者广播事件。 控制器注册以获取观察者的事件更新,并处理事件。 Kube-router由3个核心控制器和多个观察者组成,如下图所示。 每个 controller 遵循以下结构 func Run() { for { Sync() // control loop that runs for ever and perfom sync at periodic interval } } func OnUpdate() { Sync() // on receiving update of a watched API object (namespace, node, pod, network policy etc) } Sync() { //re-concile any state changes } Cleanup() { // cleanup any ch...
- 下一篇
kubernetes kube-dns service 介绍
kube-dns 是 kubernetes 基于 DNS 的服务发现模块,主要由三个容器组成,分别是 dnsmasq, kube-dns, sidecar,整体的结构如图。 sidecar sidecar 是一个监控健康模块,同时向外暴露metrics 记录,但是为啥叫三蹦子不知道。 接受的探测参数是 --probe=<label>,<server>,<dnsname>[,<interval_seconds>][,<type>] 例子如下 --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local,5,A 等于是每隔 5s 向127.0.0.1:53 进行 DNS 查询 kubernetes.default.svc.cluster.local 的 A 记录 对应的结构体是 dnsmasq dnsmasq-nanny 是 dnsmasq 的保姆进程,dnsmasq 是一个简易的 DNS server。 dnsmasq-nanny “–” 后面是 dnsmas...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS6,CentOS7官方镜像安装Oracle11G
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作