一、前置主备
四种安装途径:
1、使用kubeadmin通过离线镜像安装(推荐)
2、使用阿里云公有云平台k8s,付费
3、通过yum官方仓库安装,上古版本比较老
4、二进制包的形式进行安装,kubeasz(github)
本文采取kubeadmin方式安装,虚拟机cpu核数设置为2个,因为最低要求就是2个
准备三台虚拟机,预计是一个master节点,两个node节点
node1 master
node2 slave
node3 slave
# 统一三台虚拟机时区
timedatectl set-timezone Asia/Shanghai
# 分别设置三台虚拟机主机名便于操作
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
# 设置主机名对照关系(三台都要修改)
vi /etc/hosts
ip node1 # node1设置
ip node2 # node2设置
ip node3 # node3设置
# 关闭防火墙,三台虚拟机都要设置,生产环境跳过这一步
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
二、安装Docker(无特殊,三个节点都要操作)
安装包安装
# 把安装包上传服务器docker-ce-18.09.tar.gz,并解压
tar -zxvf docker-ce-18.09.tar.gz
# 进入安装文件夹
cd docker
# 安装
yum localinstall -y *.rpm
# 启动docker
systemctl start docker
# 设置开机启动(必须)
systemctl enable docker
yum安装方式(暂时不采用)
# 查询以前是否安装了docker
yum list installed | grep docker
或者
rpm -qa docker*
# 如果以前有安装,移除上一步查询出来的所有文件
yum remove docker-xx
# 重新安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast # 让yum自动检测哪个安装源是最快的
yum list docker-ce --showduplicates | sort -r # 查看docker库版本
# 安装docker(1.14.1版本只支持18.09版本)
yum install docker-ce-18.09.5 docker-ce-cli-18.09.5 containerd.io
# 启动docker
systemctl start docker
# 设置开机启动(必须)
systemctl enable docker
确保从cgroups均在同一个从groupfs
cgroups是control groups的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统。
cgroups是实现IaaS虚拟化(kvm、lxc等),PaaS容器沙箱(Docker等)的资源管理控制部分的底层基础。
子系统是根据cgroup对任务的划分功能将任务按照一种指定的属性划分成的一个组,主要用来实现资源的控制。
在cgroup中,划分成的任务组以层次结构的形式组织,多个子系统形成一个数据结构中类似多根树的结构。cgroup包含了多个孤立的子系统,每一个子系统代表单一的资源
docker info | grep cgroup
如下即表示不在同一组
# 新建文件夹,避免创建组cgroup命令出错
mkdir /etc/docker
# 执行下面命令使得,docker处于cgroup组
cat << EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
EOF
systemctl daemon-reload && systemctl restart docker
出现如下图,输出表示设置成功
三、安装kubeadm,kubeadm是集群部署工具(无特殊,三个节点都要操作)
# 创建文件夹
mkdir /usr/local/k8s
cd /usr/local/k8s
# 将镜像包上传至服务器,然后解压
tar -zxvf kube114-rpm.tar.gz
# 进入解压文件夹
cd kube114-rpm
# 安装文件夹中rpm
yum localinstall -y *.rpm
# 关闭交换区
swapoff -a
vi /etc/fstab
#swap一行注释
#/dev/mapper/centos-swap swap swap defaults 0 0
# 配置网桥
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
四、通过镜像安装k8s(无特殊,三个节点都要操作)
# 上传k8s-114-images.tar.gz(k8s镜像)、flannel-dashboard.tar.gz到/usr/local/k8s
cd /usr/local/k8s
docker load -i k8s-114-images.tar.gz
docker load -i flannel-dashboard.tar.gz
五、利用Kubeadm部署k8s集群
1. master主服务器配置
# 指定kubernetes版本以及虚拟ip段
kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=192.168.0.0/16
注意:节点执行完成后需要的点,如图所示1标注点是需要手动执行的,2标注点是需要salve节点执行需要的同时也是构建集群的重点,可先复制保留
kubeadm join 192.168.2.167:6443 --token hmwaai.hy98osxiyvx33u41 \
--discovery-token-ca-cert-hash sha256:578be171f98c29f1b6be09992f24c4e644144f655b368c56ef2f7ca37b4c10c1
# 手动执行1标注点命令
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 查看当前nodes状态
kubectl get nodes
#查看存在问题的pod
kubectl get pod --all-namespaces
发现两个pode处于pending状态,原因在于k8s底层使用flannel组件进行节点间通讯,所以需要安装 flannel使其处于running状态
# 先把kube-flannel.yml上传到/usr/local/k8s
# 安装flannel网络组件
kubectl create -f kube-flannel.yml
# 再查看节点状态,确保所有节点都处于running状态才行
kubectl get pod --all-namespaces
2、slave节点配置
# 执行刚才master节点构建时输出的命令,先执行node2,node2成功后再执行node3
kubeadm join 192.168.2.167:6443 --token hmwaai.hy98osxiyvx33u41 \
--discovery-token-ca-cert-hash sha256:578be171f98c29f1b6be09992f24c4e644144f655b368c56ef2f7ca37b4c10c1
# 如果上边命令忘记了,可在master节点上查看,然后node节点上执行构造语句
kubeadm token list
kubeadm join 192.168.2.167:6443 --token aoeout.9k0ybvrfy09q1jf6 --discovery-token-unsafe-skip-ca-verification
# 执行完上边命令去到master节点查看节点状态
kubectl get nodes
# 发现从节点状态为NotReady,此时进入从节点查看执行日志(如果发现是Ready代表从节点状态正常)
journalctl -f -u kubelet
查看日志信息,发现缺少cni文件,如下图所示
# 解决方法,从master节点复制cni(在从节点上执行该命令)
scp -r master1:/etc/cni /etc/cni
# 重启从节点kubelet服务
systemctl restart kubelet
# 设置开机启动命令
systemctl enable kubelet
# 再次回到master节点确认状态,确认所有从节点处于Ready状态
kubectl get node
确保master和node节点都处于Ready,且所有节点都处于Running状态代表集群正常。
3、Master开启仪表盘
开启仪表盘需要 kubernetes-dashboard.yaml、admin-role.yaml、kubernetes-dashboard-admin.rbac.yaml三个文件,先上传到master节点虚拟机上
# kubernetes-dashboard.yaml仪表盘的配置文件
kubectl apply -f kubernetes-dashboard.yaml
# admin-role.yaml定义仪表盘有哪些功能
kubectl apply -f admin-role.yaml
# kubernetes-dashboard-admin.rbac.yaml编译了系统应用权限所在
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml
# 卸载仪表盘
kubectl delete -f kubernetes-dashboard.yaml
# 查看部署节点
kubectl get deployment
kubectl delete deployment 节点名称
kubectl get service
kubectl delete service 服务名称
# 获取系统命名空间
kubectl -n kube-system get svc
# 查看仪表盘状态
kubectl get po -n kube-system |grep dashboard
仪表盘对外访问的端口32000
如若发现错误,可通过如下方式排查
# 查看仪表盘节点日志信息(节点不正常时)
kubectl describe pod kubernetes-dashboard-6647f9f49-6bqh9 --namespace=kube-system
# 查看cni日志(节点不正常时)
sudo journalctl -xe | grep cni
4、使用仪表盘部署tomcat容器
部署成功显示
5、基于NFS实现集群文件共享
在master节点上操作,把master节点当作文件共享服务器
# master节点安装nfs-utils和rpcbind
yum install -y nfs-utils rpcbind
# 进入/usr/local,并创建data目录
cd /usr/local
mkdir data
# 进入data,并创建 www-data
cd data
mkdir www-data
cd www-data
# 设置哪个文件夹对外暴漏
vim /etc/exports
# 设置读写文件夹,保存退出
/usr/local/data/www-data 192.168.2.167/24(rw,sync)
# 启动nfs服务和rpcbind服务
systemctl start nfs.service
systemctl start rpcbind.service
# 设置开机启动
systemctl enable nfs.service
systemctl enable rpcbind.service
# 检查是否设置成功
exportfs
node节点设置
# 安装nfs-utils
yum install -y nfs-utils
# 查看master节点共享的文件夹(ip为master的ip)
showmount -e 192.168.2.167
# 挂载本地mnt文件夹到共享文件夹(ip为master的ip)
mount 192.168.2.167:/usr/local/data/www-data /mnt
命令部署tomcat
在k8s文件夹下,分别创建tomcat-service,tomcat-deploy文件夹,两个文件夹下分别创建tomcat-service.yml,tomcat-deploy.yml文件
tomcat-service.yml文件内容如下
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
labels:
app: tomcat-service
spec:
type: NodePort
selector:
app: tomcat-cluster
ports:
- port: 8000
targetPort: 8080
nodePort: 32500
tomcat-deploy.yml内容如下
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 2
template:
metadata:
labels:
app: tomcat-cluster
spec:
volumes:
- name: web-app
hostPath:
path: /mnt
containers:
- name: tomcat-cluster
image: tomcat:latest
resources:
requests:
cpu: 0.5
memory: 200Mi
limits:
cpu: 1
memory: 512Mi
ports:
- containerPort: 8080
volumeMounts:
- name: web-app
mountPath: /usr/local/tomcat/webapps
命令创建tomcat容器
# 部署tomcat
kubectl create -f tomcat-deploy.yml
# 查看布署是否成功
kubectl get deployment
# 查看下pod
kubectl get pod -o wide
6、利用Rinted对外提供Service负载均衡支持
# 前提确保刚才启动的tomcat-deploy启动
# 删除已部署的服务
kubectl get deployment
kubectl delete deployment 节点名称
kubectl get service
kubectl delete service 服务名称
修改tomcat-service.yml,使得暴漏同一端口
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
labels:
app: tomcat-service
spec:
# type: NodePort
selector:
app: tomcat-cluster
ports:
- port: 8000
targetPort: 8080
# nodePort: 32500
创建tomcat服务
kubectl create -f tomcat-service.yml
# 查看服务
kubectl get service
# 查看服务详情
kubectl describe service tomcat-service
在共享目录创建index.jsp,并填充(获取服务器ip)
<%=request.getLocalAddr()%>
使用tomcat-service服务ip进行访问,发现显示ip会在两个服务器间切换
curl 10.108.28.103:8000/index.jsp
安装linux环境下的端口转发工具Rinted
cd /usr/local
# 下载源码包,下载不了的话采用离线包安装
wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
# 解压
tar -zxvf rinetd.tar.gz
cd rinetd
# 设置允许端口范围
sed -i 's/65536/65535/g' rinetd.c
# 在usr下创建man目录
mkdir -p /usr/man/
yum install -y gcc
# 编译安装
make && make install
看到如下信息代表安装成功
# 增加端口映射
vim /etc/rinetd.conf
# 增加端口映射(10.108.28.103为tomcat-service容器ip,8000为端口号,0.0.0.0代表允许所有ip发送请求)
0.0.0.0 8000 10.108.28.103 8000
# 加载配置文件
rinetd -c /etc/rinetd.conf
此时即可使用宿主机ip访问