「Kubernetes」- 使用 kubeadm 部署测试集群(实验性质)

更新日期:2020年06月09日

本笔记将记录如何在 CentOS 7.5 中搭建 Kubernetes v1.14 集群。

注意,本笔记记录的集群部署方法只能用于实验,不能用于生产环境。

环境概述

属性 参数
操作系统 CentOS Linux release 7.5.1804 (Core)
网络信息 k8s-master: 172.16.0.125
  k8s-node01: 172.16.0.126
  k8s-node02: 172.16.0.127
  k8s-node03: 172.16.0.128
软件信息 Kubernetes 1.14

从主节点开始,我们使用'kubeadm'和'kubectl'命令管理集群及其节点。

在所有节点上执行

#1 环境初始化

#!/bin/sh

################################################################################
# 关闭防火墙
################################################################################
systemctl stop firewalld
systemctl disable firewalld

################################################################################
# 设置关闭SELINUX
################################################################################
# setenforce 0
yes | cp /etc/selinux/config /etc/selinux/config.backup
sed -i 's%SELINUX=enforcing%SELINUX=disabled%g' /etc/selinux/config

################################################################################
# 关闭Swap分区
################################################################################
# swapoff -a && sysctl -w vm.swappiness=0
yes | cp /etc/fstab /etc/fstab.backup
sed -i -E 's/(.+swap\s+swap.+)/# \1/g' /etc/fstab

################################################################################
# 加载内核模块
################################################################################
cat > /etc/modules-load.d/kubernetes.conf <<EOF
br_netfilter
EOF

cat > /etc/sysctl.d/kubernets.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-arptables = 1
EOF
sysctl --system

#2 配置源仓库

配置源仓库,以安装必要的包:

#!/bin/sh

cat <<EOF > /etc/yum.repos.d/kubernetes-ali.repo
[kubernetes-ali]
name=Kubernetes ALi
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

# 下面是官方源(网络通常不通,所以使用阿里镜像站,但是………现在YUM支持SOCKS呀…………)
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=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
        https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

最后,更新YUM缓存

#!/bin/sh

yum makecache

#3 安装服务包(Kubeadm and Docker)

安装并启动Docker服务:

#!/bin/sh

# 在CentOS 7.4中,默认Docker 1.13版本,可能需要升级
# 这里只是演示,不详述Docker升级过程
yum install -y docker

# 如果没有「start」服务,则在「kubeadm init」时会有错误,因为在初始化的时候需要拉去镜像,该动作需要Docker服务处于运行中。
# 如果没有「enable」服务,则在「kubeadm init」时会有警告。
systemctl restart docker && systemctl enable docker

安装kubadm工具(但是不需要启动服务):

#!/bin/sh

# yum install -y kubeadm-1.16.2 kubelet-1.16.2
yum install -y kubeadm-1.14 kubelet-1.14

# 如果没有「enable」服务,则在「kubeadm init」时会有警告。
# 但是,不要「start」服务,这时候还没有初始化完成,缺少启动服务的某些配置文件(比如/var/lib/kubelet/config.yaml文件)。
# 这得感谢群里朋友的反馈 :-)
systemctl enable kubelet

#4 重启服务器

重启服务器,以验证上述配置是否生效。

在 Master 上执行

#1 节点初始化

执行如下命令进行节点初始化:

#!/bin/sh

################################################################################
# 在初始化之前
# 在初始化之间,建议使用kubeadm config images list命令,将相关镜像保存到私有仓库中。
################################################################################

################################################################################
# 开始初始化(依旧使用阿里云的镜像,没有私用私有镜像仓库)
# 
# 如果直接使用官方镜像,则初始化可能失败。因为它会去k8s.gcr.io拉取镜像,而国内网络无法访问。
# 因此上述命我们使用kubeadm init --image-repository选项指定阿里云的镜像来初始化
################################################################################
kubeadm init --image-repository registry.aliyuncs.com/google_containers

################################################################################
# 在kubeadm init执行结束后,留意下面的输出:
################################################################################
# …………
#
# Your Kubernetes control-plane has initialized successfully!
#
# To start using your cluster, you need to run the following as a regular user:
#
#   mkdir -p $HOME/.kube
#   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#   sudo chown $(id -u):$(id -g) $HOME/.kube/config
#
# You should now deploy a pod network to the cluster.
# Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
#   https://kubernetes.io/docs/concepts/cluster-administration/addons/
#
# Then you can join any number of worker nodes by running the following on each as root:
#
# kubeadm join 172.31.253.28:6443 --token dui0g7.vzeubdwe3akafoez \
#     --discovery-token-ca-cert-hash sha256:63b5f94be088b8f865fc99ba095483e1999f1d7256cf3c1dc46a6a1246b9fe66
#

# 上述内容:
# 1. 提示你初始化成功
# 2. 然后,执行下面的三条命令
# 3. 告诉你应该向集群中部署一个Pod网络,这一点参考官方中列出的网络选择
# 4. 在工作节点上执行命令可以加入集群中。

注意,旧版kubeadm init并没有--image-repository选项,但是可以通过指定--config选项kubeadm-config.yaml配置文件,该配置文件可以指定镜像仓库地址。(本文过于冗长,因此这里不再赘述,可以参考「Failling to pull images」来处理镜像无法拉取问题)

#2 部署网络插件

正如在kubeadm init输出中所提示的,我们需要在集群中部署Pod网络。在部署的Pod网络中,不同主机的Pod就可以互相访问。Pod网络是工作节点之间的覆盖网络。更多的网络策略可以参考「Networking and Network Policy」一文。
这里只是为了快速开始,所以部署了「Weave Net」网络(后面可以更换为其他网络):

#!/bin/sh

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

# 然后,执行如下命令查看状态
kubectl get nodes
kubectl get pods --all-namespaces

# !!!「nodes」要处于「Ready」状态,「pod」要处于「running」状态
# !!!当显示「ContainerCreating」时,表示正在创建,稍安勿燥

在 Node 上执行

#1 加入到Master节点中

#!/bin/sh

kubeadm join 172.31.253.28:6443 --token dui0g7.vzeubdwe3akafoez \
    --discovery-token-ca-cert-hash sha256:63b5f94be088b8f865fc99ba095483e1999f1d7256cf3c1dc46a6a1246b9fe66

# !!! error execution phase preflight: unable to fetch the kubeadm-config ConfigMap: failed to get config map: Unauthorized
# !!! 遇到这错误是因为--token选项的TOKEN时效了(部署MASTER和NODE我间隔了很久),口令是有生存时间(TTL)的。
# !!! 使用kubeadm token create命令重新创建token口令(在Master上执行)。
# !!! https://github.com/kubernetes/kubeadm/issues/1310
# !!! 或者执行kubeadm token create --print-join-command命令,重新生成JOIN命令

# 重新生成token值
kubeadm token create

# 如果token过期了,创建永不过期的token值(不建议)
kubeadm token create --ttl 0

#2 移除节点

-「How to gracefully remove a node from Kubernetes?

#!/bin/bash

kubectl get nodes

kubectl drain "<node-name>" --ignore-daemonsets --delete-local-data

kubectl delete node "<node-name>"

#3 加入 Master 节点

#!/bin/bash

# 在主节点执行
kubeadm token create --print-join-command

# 在新的主机上执行,该主机会成为主节点加入
kubeadm join 10.10.50.91:6443 --experimental-control-plane \
    --token 608cyb.7polfq8iea971x9i \
    --discovery-token-ca-cert-hash sha256:8ff3e8899e47a10ee186319a737de85374ea7c4f4cf5276ef3d5b95f66b6ebbe

验证集群状态

在Master上执行命令检查Node是否成功加入:

#!/bin/sh

kubectl get nodes
# NAME         STATUS   ROLES    AGE     VERSION
# k8s-master   Ready    master   25h     v1.14.0
# k8s-node01   Ready    <none>   7m19s   v1.14.0

参考文献


ToC

环境概述

在所有节点上执行

#1 环境初始化

#2 配置源仓库

#3 安装服务包(Kubeadm and Docker)

#4 重启服务器

在 Master 上执行

#1 节点初始化

#2 部署网络插件

在 Node 上执行

#1 加入到Master节点中

#2 移除节点

#3 加入 Master 节点

验证集群状态

参考文献