- 发布于
使用 kubeadm 安装 K8s 集群过程小记
- 作者
- 姓名
最后更新时间: 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 更新系统
服务器系统安装完成后,请自行更新系统,并安装需要的软件:
# 更新系统
yum update
# 安装常用工具
yum install vim git
2.1.2 禁用 swap 分区
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 换成国内源:
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,安装过程如下:
# 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 更换国内源(墙内用户可选)
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 配置官方源(墙外用户)
# 配置官方源
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 配置国内源(墙内用户)
# 配置国内源
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
# Set SELinux in permissive mode (effectively disabling it)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
2.3.3 网络参数配置
某些网络参数可能会导致问题,按官方文档推荐调整,具体说明可参阅参考资料2:
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
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 拉取依赖镜像(墙内用户)
# 获取依赖镜像列表
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,我们直接运行以下命令:
kubeadm init --kubernetes-version=1.17.0
执行成功后,按提示操作即可,如果不是 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`
初始化完成后会自动创建一个 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,根据文档进行安装,稍等几分钟后集群就正常运行了:
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,如果需要正常使用单节点集群,需要使用如下命令解除该限制:
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 中的一些重要概念、常用操作,以及暴露服务等。