一、环境规划
1. 集群类型
Kubernetes集群大体分为两类:一主多从、多主多从
- 一主多从:一台Master节点多台Node节点,搭建简单,但是有单机故障风险,适合测试环境
- 多主多从:多台Master节点多多Node节点,搭建麻烦,安全性高,适合生产环境
2. 安装方式
Kubernetes有多种安装方式,目前主流的方式有minikube、kubeadm、二进制包
1. minikube
一个用于快速搭建单节点Kubernetes的工具
2. kubeadm
Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kub
eadm join,用于快速部署Kubernetes 集群
官方网址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
3. 二进制包
从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。
Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护
3. 主机规划
作用 | IP地址 | 操作系统 | 配置 |
---|---|---|---|
k8s-master01 | 192.168.5.3 | Centos7.5 基础设施服务器 | 2核CPU 2G内存 50G硬盘 |
k8s-node01 | 192.168.5.4 | Centos7.5 基础设施服务器 | 2核CPU 2G内存 50G硬盘 |
k8s-node02 | 192.168.5.5 | Centos7.5 基础设施服务器 | 2核CPU 2G内存 50G硬盘 |
二、环境搭建
本次环境搭建需要安装三台Centos服务器(一主二从),然后在每台服务器中分别安装docker (18.06.3),kubeadm (1.17.4)、kubelet (1.17.4)、kubectl (1.17.4)程序
1. 主机安装
安装虚拟机过程中注意下面选项的设置:
- 操作系统设置:CPU(2C)、内存(2G)、硬盘(50G)
- 语言选择:中文简体
- 软件选择:基础设施服务器
- 分区选择:自动化分区
- 网络配置:按照下面配置网络地址信息
网络地址:192.168.142.100(每台主机都不一样,分别为100,101,102)
子网掩码:255.255.255.0
默认网关:192.168.142.2
DNS:223.5.5.5(阿里巴巴)
2. 环境初始化
1. 检查操作系统的版本
检查操作系统的版本(要求操作系统的版本至少在7.5以上):
cat /etc/redhat-release
2. 关闭防火墙和禁止防火墙开机自启动
kubernetes和docker在运行中会产生大星的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
# 关闭防火墙
systemctl stop firewalld
# 关闭防火墙开机自启
systemctl disable firewalld
# 关闭iptables服务(部分系统没有)
systemctl stop iptables
systemctl disable iptables
注:生产环境谨慎关闭防火墙
3. 设置系统主机名以及 Host 文件的相互解析
设置主机名
hostnamectl set-hostname <hostname>
# 设置192.168.142.100的主机名
hostnamectl set-hostname K8S-Master
# 设置192.168.142.101的主机名
hostnamectl set-hostname K8S-Node1
# 设置192.168.142.102的主机名
hostnamectl set-hostname K8S-Node2
主机名解析
为了方便后面集群节点间的直接调用,需要配置一下主机名解析,企业中推荐使用内部的DNS服务器
修改 _/etc/hosts_
文件
4. 时间同步
- kubernetes要求集群中的节点时间必须精确一致,所以在每个节点上添加时间同步(企业中建议配置内部的时间同步服务器):
# 启动chronyd服务 [root@K8S-Node2 etc]# systemctl start chronyd # 启动chronyd服务开机自启 [root@K8S-Node2 etc]# systemctl enable chronyd # date命令验证时间 [root@K8S-Node2 etc]# date 2021年 07月 29日 星期四 13:17:38 CST
5. 关闭 SELINUX
查看selinux是否开启:
getenforce
永久关闭selinux,需要重启:
# 修改SELINUX的值为disabled vim /etc/selinux/config
临时关闭selinux,重启之后无效:
setenforce 0
6. 禁用swap分区
- swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
- 启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
- 但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
#编辑分区配置文件/etc/fstab,注释掉swap分区一行 #注意修改完毕之后需要重启linux服务 vim /etc/fstab
7. 修改Linux内核参数
修改Linux的内核参数,添加网桥过滤和地址转发功能
编辑 _/etc/sysctl.d/kubernetes.conf_
文件,添加如下配置
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
重新加载配置
sysctl -p
加载网桥过滤模块
modprobe br_netfilter
查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter
8. 配置IPVS功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
在每个节点安装ipset和ipvsadm
yum -y install ipset ipvsadm
添加需要加载的模块写入脚本文件中
vim /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
为脚本文件添加执行权限
chmod 755 /etc/sysconfig/modules/ipvs.modules
执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
9. 重启服务器
reboot
3. 每个节点安装Docker、kubeadm、kubelet和kubectl
1. 安装Docker
设置阿里云镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
设置镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看当前镜像源中支持的Docker版本
yum list docker-ce --showduplicates
安装特定版本的Docker-ce(必须指定—setopt=obsoletes=0,否则yum会自动安装更高版本)
yum -y --setopt=obsoletes=0 install docker-ce-18.06.3.ce-3.el7
添加配置文件
- Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
- registry-mirrors修改为阿里云镜像 ```shell mkdir -p /etc/docker
cat <
- 启动服务、查看服务版本
```shell
# 开启docker
systemctl start docker
systemctl enable docker.service
# docker开机自启
systemctl enable docker
# 查看docker版本
docker version
2. 安装Kubernetes组件
设置镜像源
- 由于Kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源
cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
安装kubeadm、kubelet和kubectl
由于版本更新频繁,这里指定版本号部署:
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改”/etc/sysconfig/kubelet”文件的内容:
vim /etc/sysconfig/kubelet
# 修改
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
- 设置为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动:
systemctl enable kubelet
4. 准备集群镜像
在安装Kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可通过下面命令查看
kubeadm config images list
由于镜像在kubernetes仓库中,由于网络原因无法连接,下面提供了一种替代方案(有问题) ```shell images=( kube-apiserver:v1.21.3 kube-controller-manager:v1.21.3 kube-scheduler:v1.21.3 kube-proxy:v1.21.3 pause:3.4.1 etcd:3.4.13-0 coredns:v1.8.0 )
for imageName in ${images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/k8sos/$imageName docker tag registry.cn-hangzhou.aliyuncs.com/k8sos/$imageName k8s.gcr.io/$imageName docker rmi registry.cn-hangzhou.aliyuncs.com/k8sos/$imageName done
<a name="63hZD"></a>
## 5. 部署K8S的Master节点
- 部署k8s的Master节点(192.168.142.100):
```shell
# 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址
# 初始化
kubeadm init \
--apiserver-advertise-address=192.168.142.100 \
--image-repository=registry.cn-hangzhou.aliyuncs.com/k8sos \
--kubernetes-version=v1.21.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
执行后Kubernetes会在底层创建数据
根据提示消息,在Master节点上使用kubectl工具:
# 执行下面命令 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看kubernetes节点
kubectl get nodes
可在需要移除的节点上,重置kubeadm的安装状态:
sudo kubeadm reset
6. 部署K8S的Node节点
- 根据提示,在192.168.142.101和192.168.142.102上添加如下的命令(命令取自Master中的提示内容):
kubeadm join 192.168.142.100:6443 --token 8zbr5j.t75f708ab5umo6pv \ --discovery-token-ca-cert-hash sha256:40b0c62c1648dcc6110537a3305b0d3fc1eb33e299c1327c787e65a4f552d0db
7. 安装网络插件
使用 _kubectl get nodes_
命令查看节点信息
kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel
下面操作依旧只在 Master 节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行
- kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,本次选择flannel,如果网络不行,可以使用本人提供的kube-flannel.yml,当然,你也可以安装calico,请点这里calico.yaml,推荐安装calico。
在Master节点上获取flannel配置文件(可能会失败,如果失败,请下载到本地,然后安装):
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
使用配置文件启动flannel:
kubectl apply -f kube-flannel.yml
查看部署CNI网络插件进度:
kubectl get pods -n kube-system
再次在Master节点使用kubectl工具查看节点状态:
kubectl get nodes
查看集群健康状况:
kubectl get cs
kubectl cluster-info
三、服务部署
在Kubernetes集群中部署一个Nginx程序,测试下集群是否正常工作(Master节点)
部署Nginx:
kubectl create deployment nginx --image=nginx
暴露端口:
kubectl expose deployment nginx --port=80 --type=NodePort
查看服务状态:
kubectl get pod,svc