目录
- 一、 以Node1节点为例创建虚拟机
- 二、 环境初始化
- 三、集群所需组件安装
- 1. docker(18.06.3)
- 2. 安装Kubernetes组件
- 四、安装Kubernetes集群
- 1. 准备集群镜像
- 2. 集群初始化
- 3. 安装网络插件
- 五、环境测试(服务部署)
集群规模:一主二从(一个master节点,两个node节点)。
虚拟机:VMware Workstation
节点环境:
节点名称 | 操作系统 | IP地址 | 配置 |
---|---|---|---|
master | centos7.5 | 192.168.12.100 | 2核CPU,2G内存,40G硬盘 |
node1 | centos7.5 | 192.168.12.101 | 2核CPU,2G内存,40G硬盘 |
node2 | centos7.5 | 192.168.12.102 | 2核CPU,2G内存,40G硬盘 |
一、 以Node1节点为例创建虚拟机
镜像文件下载地址。
如何安装虚拟机详见安装虚拟机。
打开Vmware Workstation,点击创建新的虚拟机
这里所设置的40G是一个最大限度,实际使用时用多少占多少,不是一下给你40G。
可以把这两个设备删除。
为虚拟机添加操作系统镜像,之前在创建虚拟机时我们创建的是一个空的虚拟机。这里的ISO映像文件就选择最初下载好的CentOS-7-x86_64-DVD-1804.iso。
不想检测也可以按Esc键跳过检测。
灰的是正在检测,等一会,变成高亮以后才能编辑。
完成后再等一会,等他变成高亮状态。
会分区的也可以自己分区,但是不推荐,在测试环境中自动分区就够了。
再进行IPv4设置。这里一定要注意网段的设置!我的是192.168.12.x,查看本机网段方法如下:
点击开始安装。此时需要设置密码。设置完后等待安装。
安装后按提示重启,登陆进去。(关机poweroff)
至此,node1安装完毕,其余node2与master安装过程除ip地址和主机名不一样除外,其他安装步骤一样。
二、 环境初始化
需要在三台虚拟机上同时进行。因此我们可以使用一个软件叫MobaXterm来在三台主机上同时完成。
MobaXterm安装地址
连接虚拟机教程
- 检查操作系统版本
Kubenetes集群要求CentOS版本在7.5及以上。
cat /etc/redhat-release
- 主机名解析
为方便后面集群节点间直接调用,在此配置主机名解析,企业中推荐使用内部的DNS服务器。编辑三台服务器的/etc/hosts,添加如下内容:然后保存退出
vim /etc/hosts# 在最后添加如下内容
192.168.12.100 master
192.168.12.101 node1
192.168.12.102 node2
可以自己测试一下是否设置成功,推出多台模式,选择其中一台(以master为例),看看能不能ping通:
- 时间同步
Kubernetes要求集群中节点时间必须精确一致,因此使用chronyd服务从网络同步时间,企业中建议配置内部的时间同步服务器
# 启动chronyd服务
1. systemctl start chronyd
# 设置chronyd服务开机自启
2. systemctl enable chronyd
# chronyd服务启动稍等几秒钟,使用date命令验证时间
3. date
设置成功
- 禁用iptables和firewalld服务
Kubenetes和Docker在运行过程中会产生大量的iptables规则,为不让系统规则与他们混淆,直接关闭系统的规则。
1. systemctl stop firewalld
2. systemctl disable firewalld
3. systemctl stop iptables
- 禁用selinux
selinux是linux系统的一个安全服务,如果不关闭它,在集群安装中会出现各种奇葩问题。
# 可以先查看是否开启
getenforce
# 临时关闭方式(重启后又会生效,不建议)
setenforce 0
# 编辑/etc/selinux/config文件,修改SELINUX的值为disabled
# 注意修改完毕后,需要重启linux服务
vim /etc/selinux/config
发现修改之后依旧是开启状态,因为要重启。(后面步骤做完统一重启,先不在这一步重启)
- 禁用swap分区
swap分区是指虚拟内存分区,作用在物理内存使用完后,将磁盘空间虚拟成内存来使用。启用swap会对系统性能产生较大负面影响,因此Kubernetes要求每个节点禁用swap设备。
如果因为某些原因无法关闭swap分区,需要在集群安装过程中通过明确的参数进行配置说明(自行搜索 )。
# 编辑分区配置文件/etc/fstab,注释掉swap分区这一行
# 注意修改完毕后需要重启linux
vim /etc/fstab
- 修改Linux内核参数
修改Linux内核参数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件(新建一个新文件),添加如下配置
vim /etc/sysctl.d/kubernetes.confnet.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
- 配置ipvs功能
Kubernetes中service有两种代理模型,一种基于iptables,一种基于ipvs,二者比较的话,ipvs性能更高,因此需要手动载入ipvs模块。
第一次使用yum中出现了一点小问题(估计有梯子不会出现),问题及解决方法:入口。
# 安装ipset和ipvsadm
1. yum install ipset ipvsadm -y
# 添加需要加载的模块写入脚本文件(加载五个模块)
2. 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
# 为脚本添加执行权限
3. chmod +x /etc/sysconfig/modules/ipvs.modules
# 执行脚本文件
4. /bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看对应模块是否加载成功
5. lsmod | grep -e ip_vs -e nf_conntrack_ipv4
- 重启服务器
上面所有任务完成后,重启Linux系统。
reboot
重启后检查以上面的操作是否生效了:
1. getenforce # 检查selinux
2. free -m # 通过查看内存分配来检查seap是否已经禁用
三、集群所需组件安装
需要在每台服务器上分别安装docker(18.06.3)、kubeadm(1.17.4)、kubelet(1.17.4)、kubelet(1.17.4)。
1. docker(18.06.3)
# 1. 切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2. 查看当前镜像源中支持的docker版本
# 看看有没有18.06.3.ce-3.el7这个版本(1. 比较稳定;2. 对一些参数做了初始化而不需要配置)
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在默认情况下使用的Cgroups Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
# 5. 启动docker
systemctl restart docker
systemctl enable docker # 设置开机自启动
# 6. 检查docker状态和版本
docker version
过程记录:
第一步中间是-O,大写O,之前试过0和o都无法获取!!
第二步结果:
第三步中间有一个warnning(三台主机都有):
第四步检查一下文件:
第五步:
2. 安装Kubernetes组件
# 由于Kubernetes镜像源在国外,速度比较慢,因此需要切换成国内的镜像源
# 编辑/etc/yum.repos.d/kubernetes.repo,添加如下配置
# 如果yum源报错,将baseurl的http改成https,或者去阿里云镜像站复制最新的地址
vim /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.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
# 安装kubeadm、kubelet和kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
# 配置kubelet的cgroup
# 编辑/etc/sysconfig/kubelet,添加如下配置(原来这个文件是有内容的,删掉,添加如下内容)
vim /etc/sysconfig/kubeletKUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 设置kubelet开机自启
systemctl enable kubelet
# 这里仅设置了开机自启没有启动,是因为在kubernetes启动时会自动启动kubelet
四、安装Kubernetes集群
1. 准备集群镜像
在安装Kubernetes之前,必须要准备好集群需要的镜像,通过如下命令查看集群所需镜像:
kubeadm config images list
显示最新的版本是1.31.1,给出的建议版本是1.17.17,为与之前保持同步,仍旧用1.17.4。定义要下载的镜像:
images=(kube-apiserver:v1.17.4kube-controller-manager:v1.17.4kube-scheduler:v1.17.4kube-proxy:v1.17.4pause:3.1etcd:3.4.3-0coredns:1.6.5
)for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
docker images查看镜像:
2. 集群初始化
- 注意:以下操作只需要在master节点上进行
# 创建集群
kubeadm init \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.12.100
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config# 注意以下命令是运行在node上的
kubeadm join 192.168.12.100:6443 --token 3sth53.mqefyjvempzkqqp7 \--discovery-token-ca-cert-hash sha256:6045d94a76bf7f1c2d31715f865e1255003aa37b4ce8a2c49352a6fbbce3bb68
两个黄框框中间的命令是配置网络的。复制下来备用。
# You should now deploy a pod network to the cluster.
# Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
# https://kubernetes.io/docs/concepts/cluster-administration/addons/
使用命令kubectl get nodes查看当前集群情况:
当前集群中只有一个master节点。现在去node1中去运行kubeadm join那条命令:
现在再回到master查看集群状态:新增了我们刚刚加入的node1节点。
再到node2中运行一下kubeadm join那条命令,将node2也加入到集群中:
此时集群中节点的状态都是NotReady,是因为没有配置网络,如想使其变成ready状态,则需安装网络插件。查看pods也可以发现coredns也处于pending状态,因为没有网络。
3. 安装网络插件
kubernetes支持多种网络插件:flannel、calico、canal等,任选一种使用,本文选择flannel。
以下操作只在master节点上执行即可,插件使用的是DaemonSet控制器,他会在每个节点上都运行。
# 下载配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 配置
kubectl apply -f kube-flannel.yml
# 查看集群pod
kubectl get pods -n kube-system
注意,在安装过程中涉及到拉取镜像,因此我们需要修改一下docker的镜像源,否则会出现拉取不成功的错误(Init:ImagePullBackOff):
1. vim /etc/docker/daemon.json
2. # 修改registry-mirrors部分
"registry-mirrors": ["https://dockerpull.com","https://docker.m.daocloud.io","https://dockerproxy.com","https://dockerhub.icu","https://hub.rat.dev","https://docker.1panel.live","https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"]
3. systemctl restart docker
此时发现,安装了网络插件后,当前pods中并没有flannel的pod:
因为他单独创建了一个命名空间:
kubelet get ns
在flannel的命名空间中查看其pod状态:
kubectl get pods -n kube-flannel
此时发现,有两个flannel的pod没有运行成功?原来是因为只修改了master节点的docker镜像源,node1和node2忘记修改了!因此分别进入node1和node2节点,重复上述修改镜像源步骤:
修改完毕后等待几分钟,重新回到master节点查看flannel的pods:全部运行成功!
查看node状态:ready成功!
至此,kubernetes集群搭建完毕,下面就可以在其中部署服务了。
五、环境测试(服务部署)
部署一个服务来测试一下集群是否正常工作。以nginx服务为例:
- 部署nginx
kubectl create deployment nginx --image=nginx:1.14-alpine
- 暴露端口,以便可以通过外部浏览器访问
kubectl expose deployment nginx --port=80 --type=NodePort
- 查看服务状态
kubectl get pod,svc # service
31248这个端口号就是暴露给外界的,可以通过访问服务器ip(192.168.12.100)+端口号来访问到这个服务,通过这个套接字转换到nginx中(80端口)。在浏览器中输入这个套接字:
说明这个服务已经正常提供。
参考:B站视频