使用 kubeadm 创建一个 kubernetes 集群
source link: https://www.purewhite.io/2017/12/17/use-kubeadm-setup-k8s/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
使用 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,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
, 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 和其它控制组件等。
界面差不多如下:
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)
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK