ekwong.cn

尔康的博客

0%

CentOS7机器搭建k8s集群

搭建文档

设备要求

  • 至少三台 Linux 设备,即至少一台 master 两台 node;

  • 每台设备需要至少 2 核 CPU,8G 内存和 40G 硬盘空间;

  • Linux 系统需要支持 overlay2 存储驱动,可用指令 xfs_info / 查看系统是否支持,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ## 如果 ftype=1 ,说明支持 overlay2 驱动
    [root@localhost ~]# xfs_info /
    meta-data=/dev/mapper/centos-root isize=512 agcount=4, agsize=3276800 blks
    = sectsz=512 attr=2, projid32bit=1
    = crc=1 finobt=0 spinodes=0
    data = bsize=4096 blocks=13107200, imaxpct=25
    = sunit=0 swidth=0 blks
    naming =version 2 bsize=4096 ascii-ci=0 ftype=1
    log =internal bsize=4096 blocks=6400, version=2
    = sectsz=512 sunit=0 blks, lazy-count=1
    realtime =none extsz=4096 blocks=0, rtextents=0

安装

修改系统设置

修改主机名

为了方便起见,修改主机的 hostname,以三台机器为例:

1
2
3
4
5
6
## 在 master 机器
hostnamectl set-hostname master
## 在 node1 机器
hostnamectl set-hostname node1
## 在 node2 机器
hostnamectl set-hostname node2

然后退出登录,重新登录进来,就可以看到 hostname 已经更改了。

关闭防火墙

由于是自行练习 kubernetes 使用,建议直接关闭防火墙,避免很多网络问题。若在生产环境,请相关负责网络的同事处理相关网络问题。

1
2
systemctl stop firewalld
systemctl disable firewalld

关闭 selinux

需要关闭 selinux,可以编辑 /etc/selinux/config 文件,设置 SELINUX=disabled,重启设备:

1
vi /etc/selinux/config

关闭 swap

由于 kuberntes 集群子节点重启时,需要关闭 swap ,建议直接设置在 /etc/profile

1
2
3
4
5
## 编辑该文件
echo "swapoff -a" >> /etc/profile

## 保存后,使之生效
source /etc/profile

安装 docker-ce

因为 kubernetes 集群依赖于 docker,所以我们需要给所有的 设备安装 docker-ce,可以参照以下步骤或官网

由于设备上可能有旧的包,所以这里先要进行移除

1
2
3
4
5
6
7
8
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

安装 yum 工具

1
yum install -y yum-utils

添加 docker 的仓库

1
2
3
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

现在,可以执行 docker 的安装了

1
yum install -y docker-ce docker-ce-cli containerd.io

启动 docker 并设置开机启动

1
2
systemctl start docker
systemctl enable docker

编辑 /etc/docker/daemon.json 添加网易 docker image 镜像源,添加如下内容 :

1
2
3
4
5
6
{
...
"registry-mirrors": ["https://hub-mirror.c.163.com/"],
"exec-opts": ["native.cgroupdriver=systemd"]
...
}

然后重启 docker:

1
systemctl restart docker

安装 kubeadm

kubeadm 是 kubernetes 集群的管理工具,所有的设备都必须安装这个工具才能加入集群,由于kubernetes 官网在国外,网络问题,我们使用阿里源来安装 kubeadm 工具

添加 yum 源:

1
2
3
4
5
6
7
8
9
10

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=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

更新 yum 源

1
yum update

安装 kubeadm

1
yum install kubeadm -y

启动 kubelet 并设置开机启动

1
2
systemctl enable kubelet
systemctl start kubelet

部署集群

如果您已安装了 kubernetes 所需的各软件后,就可以执行部署啦。

部署流程大致分为三步:

  1. 初始化 master 节点;
  2. 部署网络插件;
  3. 各 node 节点加入集群;

初始化 Master 节点

集群(英文:Cluster)需要在 master 节点进行初始化,基础指令是 kubeadm init,在这个教程中,我们指定一下 api server 的IP地址和 CIDR 的 IP段,请在 master 机器上执行集群的初始化:

1
kubeadm init  --apiserver-advertise-address 0.0.0.0 --pod-network-cidr 10.244.0.0/16

这个初始化的过程可能需要好几分钟,需要从 k8s 的官网拉取很多 image 下来,如果网络较差,时间可能会更久。

如果在 master 机器上,ping k8s.gcr.io 不通,请在这个指令后加上阿里云源参数 —image-repository registry.aliyuncs.com/google_containers

完整的指令则是:

1
kubeadm init  --apiserver-advertise-address 0.0.0.0 --pod-network-cidr 10.244.0.0/16 —image-repository registry.aliyuncs.com/google_containers

集群初始化后,会提示执行以下操作,创建配置目录和修改文件所有者信息:

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

集群初始化后,还会有一条允许其它 node 节点加入集群的提示语,类似下面,请保存下来,下面 node 节点加入集群需要用到。

1
kubeadm join 192.168.200.20:6443 --token yzifqp.6p8o99bxp08xxrcc  --discovery-token-ca-cert-hash sha256:5f656ae26b5e7d4641a979cbfdffeb7845cc5962bbfcd1d5435f00a25c02ea50

安装网络插件

集群中的 pod 进行通讯需要网络插件,我们这里使用 flannel 插件。若您需要使用其它网络插件,请在 kubernetes 官网查询。

网络插件本质,是一种 kubernetes 资源,flannel 的项目在 GitHub 上,对应的配置文件地址在这里。把文件下来下来,或复制配置内容,写入本地文件,保存为 .yml 类型,例如这里保存为 kube-flannel.yml

在 master 机器上,执行以下操作:

上传 kube-flannel.yml 文件,然后在文件所在目录下,部署该文件:

1
kubectl apply -f kube-flannel.yml

部署可能需要一点时间,可以查看部署情况:

1
2
# kubectl get pods -n kube-system | grep kube-flannel
kube-flannel-ds-amd64-g667t 1/1 Running 1 19h

如果状态显示 running ,则网络插件部署成功了。

在部署网络插件 flannel 的过程中,可能出现 image 拉取错误,可以查看 log 看看具体是什么问题,有时候可能是 quay.io 访问异常,可以替换 kube-flannel.yml 中的 image 源为七牛云源 quay-mirror.qiniu.com ,然后重新部署 flannel

各 node 节点加入集群

在完成了 master 节点初始化集群和安装网络插件后,可在各 node 节点机器 使用初始化完 master 节点后出现的加入集群指令来加入集群:

1
2
3
## 这里 192.168.200.20 是你的集群的 api server 的 ip,在本例中是 master 机器的 ip
## 这里 --token 后的字段和 sha256: 后的字段会不同
kubeadm join 192.168.200.20:6443 --token yzifqp.6p8o99bxp08xxrcc --discovery-token-ca-cert-hash sha256:5f656ae26b5e7d4641a979cbfdffeb7845cc5962bbfcd1d5435f00a25c02ea50

提示已成功加入集群后,可在 master 节点机器上查看各 node 节点机器信息:

1
kbuectl get nodes -o wide

常见问题

重置集群

在创建集群的时候,可能因安装出错而想要重新来过,此时,你可以重置集群,分别在 master 和各 node 机器上进行重置即可:

在 master 机器上执行:

1
2
3
4
kubeadm reset
rm -rf /etc/cni/net.d
rm -rf ~/.kube/config
rm -rf /var/lib/cni/

在 node 机器上执行:

1
2
3
kubeadm reset
rm -rf /etc/cni/net.d
rm -rf ~/.kube

某个 node 节点需重置

在 node 节点加入集群的操作中,可能出现想要重置这个节点,而其它机器不变的情况,那么需要在该节点上执行重置:

1
2
3
4
kubeadm reset
rm -rf /etc/cni/net.d
rm -rf ~/.kube
rm /etc/kubernetes/kubelet.conf /etc/kubernetes/pki/ca.crt

然后在 master 机器上执行以下指令,删除该 node 节点:

1
2
## 假设是 node3
kubectl delete pod node3

然后在 node3 的机器上重新执行加入集群操作即可。

部分 image 拉取很慢

在初始化集群的过程中,需要拉取很多 image ,如果出现报错某些 image 拉取失败或者很慢,可以到对应的节点机器上,手动执行 docker pull $image_name:$image_tag 来拉取该 image;

常用指令

这里列出一些常用的指令,

在 master 机器执行:

1
2
3
4
## 查看当前集群的所有 node 机器信息
kubectl get nodes -o wide
## 描述某个 node 节点的信息
kubectl describe node $node_name