K8s 集群搭建

Kubernetes 是什么

Kubernetes,又称为 K8s (首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s,所以简称 K8s) 或者简称为 kube ,是一种可自动实施 Linux 容器操作的开源平台。它可以帮助用户省去应用容器化过程的许多手动部署和扩展操作。也就是说,Kubernetes 可以将运行 Linux 容器的多组主机聚集在一起,帮助我们轻松高效地管理这些集群。

关于 K8s 的架构组成,可以查看这篇文章

前期准备

主机

想要体验 K8s,您至少需要两台 Linux 主机 (不然怎么能称作集群呢),一台主机做为 master,其余主机做为 worker。当然如果你只有一台主机,也想体验一下 Kubernetes, 确实也是可以的。可以查阅一下 k3sk0s 相关资料。

以我的集群为例,我有 5 台主机,1 台 master,4 台 worker。
尚哲云

环境准备 (所有主机都需要配置)

下面的命令请使用root用户执行 (Debian/Ubuntu)

主机配置

  1. 关闭防火墙
    1
    2
    3
    4
    $ systemctl stop firewalld
    $ systemctl disable firewalld
    # 检查防火墙状态
    $ systemctl status firewalld
  2. 关闭 selinux (Ubuntu用户可略过)
    1
    $ sed -i 's/enforcing/disabled/' /etc/selinux/config
  3. 关闭 swap
    1
    sed -ri 's/.*swap.*/#&/' /etc/fstab
  4. 设置主机名 (可选,便于后续管理)
    1
    $ hostnamectl set-hostname <你想要的主机名>
  5. 将桥接流量传递到 iptables
    1
    2
    3
    4
    5
    $ cat << EOF > /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    $ sysctl --system

安装并配置 Docker

首先安装 docker,如果已经安装了可以略过。

1
curl -fsSL https://get.docker.com | sh -s -- --mirror Aliyun

配置镜像仓库,加速拉取镜像

1
2
3
4
5
6
7
8
9
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2",
"registry-mirrors": ["https://mirorr.szlee.cn", "http://hub-mirror.c.163.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

测试一下

1
docker ps

没有报错即安装成功。

开始安装

下面的命令请使用root用户执行 (Debian/Ubuntu)

在所有主机上安装 kubelet、kubeadm、kubectl

1
2
3
4
5
6
7
8
9
10
11
12
# 添加并信任APT证书
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

# 添加源地址
add-apt-repository "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"

# 更新源并安装最新版 kubenetes
apt update && apt install -y kubelet kubeadm kubectl

# 添加 completion,最好放入 .bashrc 中
source <(kubectl completion bash)
source <(kubeadm completion bash)

下面的命令不是在所有主机上执行的,执行前需要看清楚。

初始化 Master 节点 (仅在 master 节点执行)

1
2
3
4
5
kubeadm init \
--image-repository='mirror.szlee.cn' \
--control-plane-endpoint=<your-master-ip> \
--pod-network-cidr=172.6.0.0/16 \
--service-cidr=172.8.0.0/16

参数解读:

第2行: –image-repository=’mirror.szlee.cn’,从 mirror.szlee.cn 中拉取 K8s 基础镜像,由于 kubeadm 默认从 k8s.gcr.io 拉取镜像,国内无法访问,所以需要制定镜像仓库。

第3行: –control-plane-endpoint=,指定该 master 的通讯地址,其他节点必须能通过该地址访问到 master,在尚哲云中,这个值为 10.0.0.6 (可以参考一下上面的拓扑图)

第4行: –pod-network-cidr=172.6.0.0/16,指定 Pod 的 IP 段,只要跟你的网段不重复即可。

第5行: –service-cidr=172.8.0.0/16,指定 Service 的 IP 段,只要跟你的网段不重复即可。
如需了解全部参数信息,请查阅 kubeadm官方文档

kubeadm init 首先运行一系列预检查以确保机器准备运行 Kubernetes,如果有错误,则会报告并退出。然后 kubeadm init 下载并安装 Master 所需组件 (kube-scheduler、kube-api-server、etcd等)。这可能会需要几分钟。 完成之后你应该看到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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:
/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

记录 kubeadm init 输出的 kubeadm join 命令 (最后一行的那个),然后去 worker 节点上执行。

初始化工作节点 (worker 主机上执行)

执行刚刚 master 节点输出的 kubeadm join 命令即可。

检查工作节点状态并部署网络插件 (master 主机上执行)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ kubectl get no
NAME STATUS ROLES AGE VERSION
eddie NotReady worker 1m v1.22.9
lsz NotReady worker 1m v1.22.9
lsz-ke NotReady worker 1m v1.22.9
youth NotReady control-plane,master 1m v1.22.9
yueer NotReady worker 1m v1.22.9

# 如果你没有给 worker 打 role 标签,那么 worker 节点会显示 <none>,这是正常的。

# youth : 10.0.0.6
# eddie : 10.0.0.7
# yueer : 10.0.0.8
# lsz : 10.0.0.9
# lsz-ke: 10.0.0.10

可以看到,我们的所有节点还处在 NotReady 状态,因为各节点间还未能正常通信,现在我们部署网络插件

  1. 下载 kube-flannel.yml
  2. 修改 128 行的网络为我们的 Pod IP 地址段 172.6.0.0/16
  3. 执行 kubectl apply -f kube-flannel.yml

稍等 1 分钟后再次查看节点状态

1
2
3
4
5
6
7
$ kubectl get no
NAME STATUS ROLES AGE VERSION
eddie Ready worker 2m v1.22.9
lsz Ready worker 2m v1.22.9
lsz-ke Ready worker 2m v1.22.9
youth Ready control-plane,master 2m v1.22.9
yueer Ready worker 2m v1.22.9

发现节点已经全部 Ready,k8s搭建成功!