Centos7 搭建Kubernetes集群环境实践

一、前置主备

四种安装途径:
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访问

猜你喜欢

转载自blog.csdn.net/qq_21875331/article/details/79442826