Kubernetes 集群搭建

发布于 2024-03-09 10:27:18 字数 13017 浏览 39 评论 0

一. 环境规划

1.1 集群规划

Kubernetes 集群大体上分为两类:一主多从多主多从

  • 一主多从:一台 Master 节点和多个 Node 节点,搭建简单,但是有单点故障风险,适合用于测试环境
  • 多主多从:多台 Master 节点和多台 Node 节点,搭建麻烦,安全性高,适合生产环境

1.2 安装方式

Kubernetes 有多种搭建方式,目前主流的方式有 Kubeadm、minikube、二进制包

  • minikube:一个用于快速搭建单节点 Kubernetes 的工具
  • Kubeadm:一个用于快速搭建 Kubernetes 集群的工具
  • 二进制包:从官网下载每个组件的二进制包,依次安装,此方式对于理解 Kubernetes 组件更加有效

本文用 Kubeadm 方式安装 Kubernetes 集群

1.3 主机规划

主机名称作用操作系统IP 地址配置
node01MasterCentOS7.5 1804 基础设施服务器192.168.0.1012 核 2G 内存 50G 硬盘
node02NodeCentOS7.5 1804 基础设施服务器192.168.0.1022 核 2G 内存 50G 硬盘
node03NodeCentOS7.5 1804 基础设施服务器192.168.0.1032 核 2G 内存 50G 硬盘

二. 集群搭建

本次环境搭建需要安装三台 Linux 系统(一主两从),然后为每个节点安装 Docker(18.06.3),Kubeadm(1.17.4)、Kubelet(1.17.4)、Kubectl(1.17.4)程序。

2.1 环境初始化

(1)检查操作系统版本

#此方式下安装 Kubernetes 集群要求 CentOS 版本要大于等于 7.5
cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 

(2)主机名解析

为了后面集群节点的直接调用,在这配置一下主机名解析,企业中推荐使用内部的 DNS 服务器

#编辑三台服务器/etc/hosts 文件,添加下列内容
192.168.0.101 node01
192.168.0.102 node02
192.168.0.103 node03

(3)时间同步

Kubernetes 要求集群中的节点时间必须精确一致,这里直接使用 chronyd 服务从网络中同步时间。企业内部建议配置内部的时间同步服务器。

# 启动 chronyd 服务
systemctl start chronyd
# 设置 chronyd 服务开机自启
systemctl enable chronyd

(4)禁用 iptables 和 firewalled 服务

Kubernetes 和 Docker 在运行时会产生大量的 iptables 规则,为了不让系统规则跟他们混淆,直接关闭系统规则

# 关闭 firewalld 服务
systemctl stop firewalld
systemctl disable firewalld
# 关闭 iptables 服务
systemctl stop iptables
systemctl disable iptables

(5)禁用 selinux

selinux 是 linux 系统下的一个安全服务,如果不关闭它,在集群安装过程中会产生很多各种各样的问题

# 编辑/etc/selinux/config 文件,修改 SELINUX 的值为 disabled
# 注意修改完毕后需要重启 Linux
SELINUX=disabled

重启系统后我们可以使用下列命令,查看 SELINUX 是否禁用成功:

getenforce

(6)禁用 swap 分区

swap 分区指的是虚拟内存分区,它的作用是在物理内存不足时,将磁盘空间虚拟成内存来使用。启用 swap 分区会对系统性能产生很大负面影响,因此 Kubernetes 要求每个节点都禁用 swap 分区

# 编辑分区配置文件/etc/fstab,注释掉 swap 那一行
# 注意修改完毕后需要重启 Linux
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=118eac9a-1f8b-4483-a783-e039b883a45f /boot                   xfs     defaults       0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

重启系统后我们可以使用下列命令检查 swap 分区是否禁用成功:

free -m

(7)修改 Linux 内核参数

# 修改 Linux 内核参数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf 文件,添加如下配置:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

# 重新加载配置
sysctl -p

# 加载网桥过滤模块
modprobe br_netfilter

# 查看网桥过滤模块是否成功
lsmod | grep br_netfilter

(8)配置 ipvs

在 kubernetes 中 service 有两种代理模型,一种是基于 iptables 的,一种是基于 ipvs 的。两者比较的话,ipvs 的性能明显要高一些,但是如果要使用它,需要手动载入 ipvs 模块

# 安装 ipset ipvsadmin
yum install ipset ipvsadmin -y

# 添加需要加载的模块写入脚本文件
cat <<EOF>  /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

# 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules

# 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules

# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

(9)重启服务器

上面第(6)步和第(7)部修改完毕后都需要重启服务器,我们在最后一步一起重启生效即可。

reboot

2.2 安装 Docker

(1)切换镜像源

wget  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  -O/etc/yum.repos.d/docker-ce.repo

(2)查看当前镜像源中支持的 Docker 版本

yum list docker-ce --showduplicates

(3)安装特定版本的 docker-ce

必须指定 --setopt=obsoletes=0 ,否则 yum 会自动安装最新的版本

 yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

(4)添加配置文件

  • Docker 在默认情况下使用的 Cgroup Driver 为 cgroupfs,而 kubernetes 推荐使用 systemd 来代替 cgroupfs。
  • 修改 Docker 镜像仓库地址(加速镜像拉取速度)
mkdir /etc/docker

cat <<EOF > /etc/docker/daemon.json
{
       "exec-opts": ["native.cgroupdriver=systemd"],
       "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF

(5)启动 Docker

# 启动 docker
systemctl start docker
# 开机启动
systemctl enable docker 

2.3 安装 Kubernetes 组件

(1)修改镜像源

由于 Kubernetes 的镜像源在国外,速度比较慢,这里切换成国内的镜像源

编辑 /etc/yum.repos.d/kubernetes.repo ,添加下面的配置

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)安装 kubeadm、kubelet、kubectl

yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

(3)配置 kubelet 的 cgroup

# 编辑/etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

(4)设置 kubelet 开机自启

systemctl enable kubelet

2.4 初始化集群

(1)初始化主节点

kubeadm init \
# 使用阿里云镜像仓库
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
# 此处填写主节点 IP
--apiserver-advertise-address=192.168.0.101

这个过程会比较慢,需要等待一段时间,当我们看到下面这个提示时代表 Master 节点初始化成功:

需要注意的是,在成功输出的下方有一串提示,我们需要执行所提示的命令:

执行下列命令,我们就可以看到集群的主节点了:

kubectl get nodes

tips:如果不执行上面警告的命令,如果执行 kubectl get nodes 命令可能会出现 The connection to the server localhost:8080 was refused - did you specify the right host or port? 的保存

(2)将 Node 节点加入集群管理

在主节点上执行下列命令生成一条 token,用于子节点加入集群:

# 生成新的 token 和命令。然后在 node 上执行
kubeadm token create --print-join-command

上面生成的命令需要在工作节点上执行(Node02、Node03),这样就将工作节点加入 Master 节点(Node01)管理。加入完成后我们使用下列命令即可查看整个集群状态:

kubectl get nodes

2.5 网络插件安装

在上面的命令中,三个节点都是 NotReady 状态,这是因为集群未安装网络插件。kubernetes 支持多种网络插件,比如 flannel、calico、canal 等等,这里选择使用 flannel

提示:下列操作只在 Master 节点执行,插件使用的是 DeamonSet 的控制器,它会在每个节点上都运行

(1)创建 kube-flannel.yml 文件

# 获取 fannel 的配置文件
wget  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 

由于国内网络环境,上述文件很难直接下载,这里给出文件内容,我们只需要在 Master 节点任意地方新建 kube-flannel.yml 文件,然后将下面内容复制进去即可: http://www.wenjiangs.com/wp-content/uploads/2016/1354665/kube-flannel.yml

(2)准备镜像

在 kube-flannel.yml 定义的资源中会依赖 quay.io 仓库的镜像,但是由于这个镜像仓库是 RedHat 维护的,国内基本无法访问,所以我们需要在每个节点下面手动拉取所需要的镜像,然后将镜像名称更改为官方名称(曲线救国):

# 拉取阿里镜像
docker pull registry.cn-shanghai.aliyuncs.com/bigcoder/flannel:v0.12.0-amd64
# 备份地址(DockerHub):docker pull bigcoder/flannel:v0.12.0-amd64

# 更改镜像标签
docker tag registry.cn-shanghai.aliyuncs.com/bigcoder/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64

需要注意的是,上述命令需要在所有节点上都运行一遍,因为所有节点都需要运行 flannel 镜像。

(3)创建资源

使用配置文件启动 fannel:

kubectl apply -f kube-flannel.yml

执行完成后使用下列命令查看 Pod 是否创建成功:

kubectl get pods -n kube-system

注:如果状态是 Init:ImagePullBackOff 就说明镜像拉取失败

Pod 启动成功后我们查看节点状态,发现三个节点已经处于 Ready 状态了:

三. 集群部署测试

(1)创建一个 Nginx 服务

kubectl create deployment nginx --image=nginx:1.14-alpine

(2)暴露端口

kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort

(3)查看服务状态

kubectl get svc #svc 是 service 的简写

上面红框中就是集群在 Master 节点上暴露的端口,我们只需要通过 http://192.168.0.101:30272 即可访问 Nginx 服务。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
24 人气
更多

推荐作者

小瓶盖

文章 0 评论 0

wxsp_Ukbq8xGR

文章 0 评论 0

1638627670

文章 0 评论 0

仅一夜美梦

文章 0 评论 0

夜访吸血鬼

文章 0 评论 0

近卫軍团

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文