Kubernetes:06---kubeadm工具搭建k8s集群

  • Kubernetes从1.4版本开始引入了命令行工具kubeadm,致力于简化集群的安装过程,并解决Kubernetes集群的高可用问题
  • 在Kubernetes 1.13版本中,kubeadm工具进入GA阶段,宣称已经为生产环境应用准备就绪

一、安装kubeadm

Ubuntu、Debian或HypriotOS

  • 第一步:
sudo apt-get update && sudo apt-get install -y apt-transport-https curl

Kubernetes:06---kubeadm工具搭建k8s集群

  • 第二步:执行下面两条命令
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

# 切换到root执行
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

Kubernetes:06---kubeadm工具搭建k8s集群

Kubernetes:06---kubeadm工具搭建k8s集群

  • 第三步:更新软件源
sudo apt-get update

Kubernetes:06---kubeadm工具搭建k8s集群

  • 第四步:安装三个工具
sudo apt-get install -y kubelet kubeadm kubectl

Kubernetes:06---kubeadm工具搭建k8s集群

  • 第五步:标记指定软件包为保留,阻止软件自动更新
sudo apt-mark hold kubelet kubeadm kubectl

Kubernetes:06---kubeadm工具搭建k8s集群

  • 第六步: 然后启动Docker和kubelet
sudo service docker start

sudo service kubelet start

Kubernetes:06---kubeadm工具搭建k8s集群

CentOS、RHEL 或 Fedora

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

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable --now kubelet
  • 通过运行命令 setenforce 0 和 sed ... 将 SELinux 设置为 permissive 模式可以有效的将其禁用。 这是允许容器访问主机文件系统所必须的,例如正常使用 pod 网络。 您必须这么做,直到 kubelet 做出升级支持 SELinux 为止
  • 一些 RHEL/CentOS 7 的用户曾经遇到过问题:由于 iptables 被绕过而导致流量无法正确路由的问题。您应该确保 在 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 被设置为 1。
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 模块。这可以通过运行 lsmod | grep br_netfilter 来完成。要显示加载它,请调用 modprobe br_netfilter。

Container Linux

  • 安装 CNI 插件(大多数 pod 网络都需要):
CNI_VERSION="v0.8.2"
mkdir -p /opt/cni/bin
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgz" | tar -C /opt/cni/bin -xz
  • 安装 crictl(kubeadm/kubelet 容器运行时接口(CRI)所需)
CRICTL_VERSION="v1.16.0"
mkdir -p /opt/bin
curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz" | tar -C /opt/bin -xz
  • 安装 kubeadm、kubelet、kubectl 并添加 kubelet 系统服务:
RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"

mkdir -p /opt/bin
cd /opt/bin
curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl}
chmod +x {kubeadm,kubelet,kubectl}

curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/kubelet.service" | sed "s:/usr/bin:/opt/bin:g" > /etc/systemd/system/kubelet.service
mkdir -p /etc/systemd/system/kubelet.service.d
curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/10-kubeadm.conf" | sed "s:/usr/bin:/opt/bin:g" > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
  • 开启并启动kubelet:
systemctl enable --now kubelet

二、kubeadm config

  • kubeadm已经进入GA阶段,其控制面初始化和加入节点步骤都支持大量的可定制内容,因此kubeadm还提供了配置文件功能用于复杂定制。 同时,kubeadm将配置文件以ConfigMap的形式保存到集群之中,便于后续的查询和升级工作
  • kubeadm config子命令提供了对这一组功能的支 持:
    • kubeadm config upload from-file:由配置文件上传到集群中生成 ConfigMap
    • kubeadm config upload from-flags:由配置参数生成ConfigMap
    • kubeadm config view:查看当前集群中的配置值
    • kubeadm config print init-defaults:输出kubeadm init默认参数文 件的内容
    • kubeadm config print join-defaults:输出kubeadm join默认参数文 件的内容
    • kubeadm config migrate:在新旧版本之间进行配置转换
    • kubeadm config images list:列出所需的镜像列表
    • kubeadm config images pull:拉取镜像到本地。

默认配置文件

  • 执行下面的命令,可以取得默认的初始化参数:
sudo kubeadm config print init-defaults

Kubernetes:06---kubeadm工具搭建k8s集群

 

  • 我们可以把这些内容保存下来,作为一个配置文件使用。例如,下面将其保存为init-config.yaml
sudo kubeadm config print init-defaults > init-config.yaml

Kubernetes:06---kubeadm工具搭建k8s集群

  • 对生成的文件进行编辑,可以按需生成合适的配置。例如,若需要定制镜像仓库的地址,以及Pod的地址范围,则可以使用如下配置:

Kubernetes:06---kubeadm工具搭建k8s集群

三、下载Kuberneter相关镜像

  • 为了从国内的镜像托管站点获得镜像加速支持,建议修改Docker的配置文件/etc/docker/daemon.json,增加Registry Mirror参数,将下面的镜像配置写入配置参数中,写入之后要重启Docker。如下所示:

Kubernetes:06---kubeadm工具搭建k8s集群

  • 使用下面的命令下载所需镜像:
    • pull回去拉取镜像
    • --config指定配置文件,这个文件是上面我们创建的
sudo kubeadm config images pull --config=init-config.yaml

超时处理

  • 在执行上面命令的时候可能会超时(如果没有超时请忽略),如下图所示:

Kubernetes:06---kubeadm工具搭建k8s集群

  • 如果超时了,那么可以使用阿里云镜像重新初始化kubeadm,然后再进行拉取。命令如下:
sudo kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.18.5

sudo kubeadm config images pull --config=init-config.yaml
  • 在镜像下载完成之后,就可以进行安装了

四、安装Master

  • 至此,准备工作已就绪,执行kubeadm init命令即可一键安装Kubernetes的Master
  • 在开始之前需要注意:kubeadm的安装过程不涉及网络插件(CNI) 的初始化,因此kubeadm初步安装完成的集群不具备网络功能,任何Pod包括自带的CoreDNS都无法正常工作。而网络插件的安装往往对kubeadm init命令的参数有一定的要求。例如,安装Calico插件时需要指定--podnetwork-cidr=192.168.0.0/16,详情可参考https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#podnetwork

详细步骤

  • 接下来使用kubeadm init命令,使用前面创建的配置文件进行集群控制面的初始化:
sudo kubeadm init --config=init-config.yaml
  • 运行后,控制台将输出如下内容:

Kubernetes:06---kubeadm工具搭建k8s集群

  • 等待一段时间后,Kubernetes的Master安装成功,显示如下信息:

Kubernetes:06---kubeadm工具搭建k8s集群

  • 按照提示执行下面的命令,复制配置文件到普通用户的home目录下:

Kubernetes:06---kubeadm工具搭建k8s集群

  • 这样就在Master上安装了Kubernetes,但在集群内还是没有可用的工 作Node,并缺乏对容器网络的配置
  • 这里需要注意kubeadm init命令执行完成后的最后几行提示信息,其中包含加入节点的指令(kubeadm join)和所需的Token
  • 此时可以用kubectl命令验证在前面提到的ConfigMap:

Kubernetes:06---kubeadm工具搭建k8s集群

  • 可以看到其中生成了名为kubeadm-config的ConfigMap对象

五、安装Node,加入集群

  • 在生产环境中,Node节点一般与Master节点不处于同一个机器上,因此也需要安装Docker和kubeadm,步骤可以参阅文章开始介绍的步骤

详细步骤

  • 为kubeadm命令生成配置文件,创建文件join-config.yaml,内容如下:
    • apiServerEndpoint的值来自Master服务器的地址
    • token和tlsBootstrapToken的值就来自于使用kubeadm init安装Master的最后一行提示信息

Kubernetes:06---kubeadm工具搭建k8s集群

  • 执行kubeadm join命令,将本Node加入集群:

Kubernetes:06---kubeadm工具搭建k8s集群

  • kubeadm在Master上也安装了kubelet,在默认情况下并不参与工作负载。如果希望安装一个单机All-In-One的Kubernetes环境,则可以执行下面的命令(删除Node的Label“node-role.kubernetes.io/master”),让Master成为一个Node:

Kubernetes:06---kubeadm工具搭建k8s集群

六、安装网络插件

  • 执行kubectl get nodes命令,会发现Kubernetes提示Master为NotReady状态,这是因为还没有安装CNI网络插件:

Kubernetes:06---kubeadm工具搭建k8s集群

Kubernetes:06---kubeadm工具搭建k8s集群

七、验证Kubernetes集群是否安装完成

  • 执行下面的命令,验证Kubernetes集群的相关Pod是否都正常创建并运行:

Kubernetes:06---kubeadm工具搭建k8s集群

  • 如果发现有状态错误的Pod,则可以执行下面的命令来查看错误原因,常见的错误原因是镜像没有下载完成
kubectl --namespace=kubesystem describe pod
  • 至此,通过kubeadm工具就实现了Kubernetes集群的快速搭建。如果安装失败,则可以执行kubeadm reset命令将主机恢复原状,重新执行 kubeadm init命令,再次进行安装
上一篇:k8s安装部署问题收集


下一篇:Docker中的Cgroup Driver:Cgroupfs 与 Systemd