7

使用 kubeadm 创建一个 kubernetes 集群

 2 years ago
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.
neoserver,ios ssh client

使用 kubeadm 创建一个 kubernetes 集群

发表于 2017-12-17 更新于 2021-12-02 分类于 kubernetes 阅读次数:960 Disqus: 本文字数: 4.2k 阅读时长 ≈ 8 分钟

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

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

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

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)

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK