Kubernetes 集群搭建
一. 环境规划
1.1 集群规划
Kubernetes 集群大体上分为两类:一主多从和多主多从
- 一主多从:一台 Master 节点和多个 Node 节点,搭建简单,但是有单点故障风险,适合用于测试环境
- 多主多从:多台 Master 节点和多台 Node 节点,搭建麻烦,安全性高,适合生产环境
1.2 安装方式
Kubernetes 有多种搭建方式,目前主流的方式有 Kubeadm、minikube、二进制包
- minikube:一个用于快速搭建单节点 Kubernetes 的工具
- Kubeadm:一个用于快速搭建 Kubernetes 集群的工具
- 二进制包:从官网下载每个组件的二进制包,依次安装,此方式对于理解 Kubernetes 组件更加有效
本文用 Kubeadm 方式安装 Kubernetes 集群
1.3 主机规划
主机名称 | 作用 | 操作系统 | IP 地址 | 配置 |
---|---|---|---|---|
node01 | Master | CentOS7.5 1804 基础设施服务器 | 192.168.0.101 | 2 核 2G 内存 50G 硬盘 |
node02 | Node | CentOS7.5 1804 基础设施服务器 | 192.168.0.102 | 2 核 2G 内存 50G 硬盘 |
node03 | Node | CentOS7.5 1804 基础设施服务器 | 192.168.0.103 | 2 核 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 技术交流群。
上一篇: Kubernetes 概念与组件
下一篇: 谈谈自己对于 AOP 的了解
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论