Featured image of post 使用 kubeadm 安装 K8s 集群过程小记

使用 kubeadm 安装 K8s 集群过程小记

之前纯手工搭建过 K8s 集群,虽然最后勉强成功,但也得到一个结论:如果没有足够深度的 Linux 知识,还是不要自寻烦恼。目前官方提供的安装工具 kubeadm 已经达到了生产可用的程度,所以进行了尝试,非常简单快捷,值得推荐。 本文以学习为主要目的,以生产环境的搭建方式体验 K8s,为使用 kubeadm 搭建高可用集群提供基础。

最后更新时间: 2019 年 12 月 20 日 安装 Kubernetes 版本:1.17.0

1. 前言

之前纯手工搭建过 K8s 集群,虽然最后勉强成功,但也得到一个结论:如果没有足够深度的 Linux 知识,还是不要自寻烦恼。目前官方提供的安装工具 kubeadm 已经达到了生产可用的程度,所以进行了尝试,非常简单快捷,值得推荐。

本文以学习为主要目的,以生产环境的搭建方式体验 K8s,为使用 kubeadm 搭建高可用集群提供基础。

2. 安装步骤

2.1 基础检查

在安装 kubeadm 之前,需要确保所有主机满足以下条件:

  • 运行支持的操作系统,本文选择使用 CentOS 7搭建
  • 内存不低于 2G,CPU 不少于 2核
  • 集群中不同主机之间保证网络连通性
  • 唯一的 hostname、MAC 地址、product_uuid
  • 相关端口开放
  • swap 已被禁用

在实际操作中,大部分无须关心,重点需要关注以下几点:

2.1.1 更新系统

服务器系统安装完成后,请自行更新系统,并安装需要的软件:

1
2
3
4
# 更新系统
yum update
# 安装常用工具
yum install vim git

2.1.2 禁用 swap 分区

1
2
swapoff -a #关闭交换分区
sed -i '/ swap / s/^/#/' /etc/fstab #禁止重启后自动开启

![kubeadm-install-k8s-1.png]https://image.pbeta.me/kubeadm-install-k8s%2Fkubeadm-install-k8s-1.png)

2.1.3 关闭防火墙

请参阅参考资料1,其中提供了检测方法,本文不再重复,一般无需操作,如果主机商有防火墙,请自行至主机商控制台设置。

2.1.4 更换 Yum 源为国内源(墙内用户)

如果你是墙内用户,可以将 yum 换成国内源:

1
2
3
4
5
cd /etc/yum.repos.d  && \
sudo mv CentOS-Base.repo CentOS-Base.repo.bak && \
sudo wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
yum clean all && \
yum makecache

2.2 配置容器环境

2.2.1 安装 Docker 环境

K8s 同时支持 Docker、CRI-O、Containered 等多种容器环境,我们使用 Docker,安装过程如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Install required packages.(安装依赖包)
yum install yum-utils device-mapper-persistent-data lvm2

# Add Docker repository.(添加 Docker 库)
yum-config-manager --add-repo \
  https://download.docker.com/linux/centos/docker-ce.repo

# Install Docker CE.(安装 Docker CE)
yum update && yum install \
  containerd.io-1.2.10 \
  docker-ce-19.03.4 \
  docker-ce-cli-19.03.4

# Create /etc/docker directory.(创建 /etc/docker 目录)
mkdir /etc/docker

# Setup daemon.(配置 daemon)
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

# 创建 docker.service.d
mkdir -p /etc/systemd/system/docker.service.d
systemctl enable docker.service

# Restart Docker(重启 Docker)
systemctl daemon-reload
systemctl restart docker

安装完成后可以使用 docker -v命令查看一下安装版本: ![kubeadm-install-k8s-2.png]https://image.pbeta.me/kubeadm-install-k8s%2Fkubeadm-install-k8s-2.png)

2.2.2 Docker 更换国内源(墙内用户可选)

1
2
3
4
5
6
7
8
9
mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF

service docker restart

2.3 安装 kubeadm、kubelet 和kubectl

kubeadm 负责引导集群,kubelet 在集群的所有节点运行,负责启动 pods 和 containers,kubectl 则负责与集群交互,我们需要在所有节点安装这些组件。

2.3.1 配置 K8s 源

2.3.1.1 配置官方源(墙外用户)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 配置官方源
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

![kubeadm-install-k8s-3.png]https://image.pbeta.me/kubeadm-install-k8s%2Fkubeadm-install-k8s-3.png)

2.3.1.2 配置国内源(墙内用户)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 配置国内源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

2.3.2 关闭 SELinux

1
2
3
# Set SELinux in permissive mode (effectively disabling it)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

2.3.3 网络参数配置

某些网络参数可能会导致问题,按官方文档推荐调整,具体说明可参阅参考资料2:

1
2
3
4
5
6
7
8
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

# 确保 br_netfilter 模块已经加载
modprobe br_netfilter

![kubeadm-install-k8s-4.png]https://image.pbeta.me/kubeadm-install-k8s%2Fkubeadm-install-k8s-4.png)

2.3.4 安装并启动 kubeadm、kubelet、kubectl

1
2
3
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable --now kubelet

![kubeadm-install-k8s-5.png]https://image.pbeta.me/kubeadm-install-k8s%2Fkubeadm-install-k8s-5.png)

2.4 使用 kubeadm 初始化集群

由于 kubeadm 初始化集群的依赖镜像位于墙外,墙内用户必须在运行初始化集群集合之前使用国内源拉取依赖镜像,墙外用户则直接在初始化集群命令运行时自动拉取即可。

2.4.1 拉取依赖镜像(墙内用户)

1
2
3
4
5
6
7
8
9
# 获取依赖镜像列表
kubeadm config images list

# 使用阿里源下载 K8s 依赖镜像
kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' |sh -x

docker images |grep registry.cn-hangzhou.aliyuncs.com/google_containers |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's#registry.cn-hangzhou.aliyuncs.com/google_containers#k8s.gcr.io#2' |sh -x

docker images |grep registry.cn-hangzhou.aliyuncs.com/google_containers |awk '{print "docker rmi ", $1":"$2}' |sh -x

2.4.2 主节点初始化

使用kubeadm init命令可以初始化主节点,具体参数请查看官方文档,目前最新的 K8s 版本为 1.17.0,我们直接运行以下命令:

1
kubeadm init --kubernetes-version=1.17.0

执行成功后,按提示操作即可,如果不是 root 用户可执行以下命令:

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果是 root 用户也可直接执行以下命令:

1
export KUBECONFIG=/etc/kubernetes/admin.conf`

初始化完成后会自动创建一个 token,记录下面加入节点的命令,24小时内可使用该 token 向集群添加节点: ![kubeadm-install-k8s-6.png]https://image.pbeta.me/kubeadm-install-k8s%2Fkubeadm-install-k8s-6.png)

2.5 添加网络组件

此时我们使用kubectl get nodes查看集群节点运行情况,会发现节点始终是 NotReady,因为我们没有安装必要的网络组件,可参考参考资料4的官方文档进行选择,这里选择比较精致的 WeaveNet,根据文档进行安装,稍等几分钟后集群就正常运行了:

1
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

![kubeadm-install-k8s-7.png]https://image.pbeta.me/kubeadm-install-k8s%2Fkubeadm-install-k8s-8.png)

2.6 向集群添加节点

即使只有一台 Master 主机,集群也是可以正常使用的,但默认情况下,出于安全考虑,集群不会在 control-plane 运行节点上部署 pods,如果需要正常使用单节点集群,需要使用如下命令解除该限制:

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

![kubeadm-install-k8s-9.png]https://image.pbeta.me/kubeadm-install-k8s%2Fkubeadm-install-k8s-9.png) 如果需要添加节点请继续按下面步骤操作:

2.6.1 配置节点

每一台节点同样需要安装 Docker 和 kubeadm,所以需要在每一台主机上重复步骤1、2、3。

2.6.2 使用 kubeadm join 命令加入集群

我们配置一台主机,并加入该节点: ![kubeadm-install-k8s-11.png]https://image.pbeta.me/kubeadm-install-k8s%2Fkubeadm-install-k8s-11.png) 回到 Master 节点使用kubectl get nodes查看集群,可以看到节点已经加入了集群: ![kubeadm-install-k8s-12.png]https://image.pbeta.me/kubeadm-install-k8s%2Fkubeadm-install-k8s-12.png)

3. 总结

经过上面的操作,我们就已经成功创建了集群。下一篇文章中将主要讲解 K8s 中的一些重要概念、常用操作,以及暴露服务等。

参考资料

  1. Kubernetes 官方文档 —— Container runtimes
  2. Kubernetes 官方文档 —— Installing kubeadm
  3. Kubernetes 官方文档 —— Creating a single control-plane cluster with kubeadm
  4. Kubernetes 官方文档 —— Installing Addons
  5. Kubernetes 官方文档 —— Run a Stateless Application Using a Deployment
  6. centOS7 搭建k8s, 少受翻墙的苦
  7. 墙内安装kubernetes教程
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计