Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂载Ceph集群存储

Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂载Ceph集群存储

目录

在这里插入图片描述

一、简介

Kubespray,以前是Kargo,是Kubernetes社区保护伞下的一个项目。它是一组工具,旨在轻松部署生产就绪的Kubernetes集群。
本次部署示例是以分支v2.4.0为基础,修改而来。v2.4.0可以如下clone:

# git clone https://github.com/kubernetes-incubator/kubespray.git

或是直接使用附件一(kubespray-2.4.0.tar.gz),来进行操作,本次部署示例是以该修改后的附件一为基础来部署Kubernetes,简洁快速。

二、部署结构设计

本次部署选取VMware五台虚机进行测试(四台部署k8s,一台repository作为yum源、python源和docker仓库)。
系统均为centos7.4-minimal(CentOS-7-x86_64-Minimal-1708)。CPU均为4核,内存均为8GB,硬盘俩块均为100GB,网卡俩块(这个为后续挂载ceph存储使用)。
分布式集群选择使用三台机器作为master节点,一台机器做为node节点使用。
在这里插入图片描述
Kubernetes各个组件的版本说明如下:
在这里插入图片描述

三、基础环境配置(每台机器均执行以下操作)

3.1关闭防火墙和selinux以及交换分区

# systemctl disable firewalld && systemctl stop firewalld  && 
systemctl status firewalld 
# sed -i '/^SELINUX=.*/c SELINUX=disabled' /etc/selinux/config && 
sed -i 's/^SELINUXTYPE=.*/SELINUXTYPE=disabled/g' /etc/selinux/config 
# setenforce 0

Reboot后生效。

# swapoff –a
# vi /etc/fstab

注释掉格式是swap的那行,如下图所示:
在这里插入图片描述

3.2 yum源修改以及pip源修改

(假如你没有yum源和pip源,此步骤略过)

  1. 修改yum源配置(修改成repository的源)
# mkdir /root/repo && mv /etc/yum.repos.d/* /root/repo
# cp /root/repo/CentOS-Media.repo /etc/yum.repos.d/
# vi /etc/yum.repos.d/CentOS-Media.repo

修改内容如下图(ftp://20.46.87.183/yum-custom/):
在这里插入图片描述
然后clean一下,以及makecache

# yum clean all && yum makecache
  1. 修改pip源配置(修改成repository的源)
# mkdir /root/.pip && vi /root/.pip/pip.conf

添加以下内容:

[global]
index-url=http://20.46.87.183/pypi/packages/simple
[install]
trusted-host = 20.46.87.183

3.3安装基本的软件

以下yum包和python都是在repository节点的源里。

# yum install –y  git net-tools ntp vim ansible gcc python-pip 
python34 python34-pip 
docker-engine docker-engine-selinux
# pip install netaddr && pip install --upgrade jinja2

假如没有这些包,除了ansible和docker,别的直接在线安装很方便容易。
下面介绍ansible和docker在线安装:
新增Docker的Yum仓库:

# vim /etc/yum.repos.d/docker.repo

添加以下内容

[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

然后安装ansible和docker:

# yum clean all && yum makecache
# yum install -y epel-release
# yum install -y  ansible  docker-engine docker-engine-selinux 

使用阿里的docker镜像服务:

# mkdir -p /etc/docker
# vim /etc/docker/daemon.json

添加以下内容

{
  "registry-mirrors": ["https://7g5a4z30.mirror.aliyuncs.com"]
}

3.4修改Docker服务配置

添加信任repository节点的Registry服务,添加了repository节点的docker私有仓库。

# vim /usr/lib/systemd/system/docker.service

修改如下:

ExecStart=/usr/bin/dockerd --insecure-registry 20.46.87.183:5000
# systemctl daemon-reload && systemctl enable docker && systemctl start docker && systemctl status docker
# curl -X GET http://20.46.87.183:5000/v2/_catalog

正常如下返回数据即可:

{"repositories":[………]}

3.5添加ntp时钟服务器

# vim /etc/ntp.conf

如下图所示,
在这里插入图片描述

# systemctl enable ntpd.service && systemctl start ntpd.service && systemctl status ntpd.service
# ntpq -p

在这里插入图片描述

3.6加载br_netfilter

# modprobe br_netfilter
# ls /proc/sys/net/bridge

在这里插入图片描述

# cat >> /etc/sysctl.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
EOF
# sysctl –p

在这里插入图片描述

# sysctl -w net.ipv4.ip_forward=1

3.7 Hosts文件设置

# cat >> /etc/hosts <<EOF
192.168.224.130 k8s-master01
192.168.224.131 k8s-master02
192.168.224.132 k8s-master03
192.168.224.133 k8s-node01
EOF

3.8 Hostname设置,以及建立ssh互信

# hostnamectl set-hostname k8s-master01
# hostnamectl set-hostname k8s-master02
# hostnamectl set-hostname k8s-master03
# hostnamectl set-hostname k8s-node01

下面只要在k8s-master01节点执行即可:

# ssh-keygen
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master01
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master02
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master03
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node01

四、部署Kubernetes

首先将附件一(kubespray-2.4.0.tar.gz)传到k8s-master01节点的root目录下,然后解压:

# tar –zxvf kubespray-2.4.0.tar.gz
# cd kubespray-2.4.0

4.1修改仓库等剧本文件

这里制作好了k8s的镜像kubespray24-k8s-container.tar,解压到仓库即可,下载链接只有七天,逾期不候。具体怎么解压,怎么安装仓库,这里不再叙述,可以参考《Openstack的HA高可用容器化部署(使用kolla-ansible部署)+内置ceph集群存储》一文里面有描述。
修改原有的仓库地址为自己要用的仓库地址,其中有以下四处需要改动,将文件中原有的仓库地址(192.168.159.128:4000)修改为repository节点仓库地址(20.46.87.183:5000):

# vim roles/download/defaults/main.yml
# vim roles/kubernetes-apps/ansible/defaults/main.yml
# vim roles/docker/templates/docker.service.j2
# vim roles/kubernetes/node/defaults/main.yml

或是直接使用批量修改命令如下:

# sed -i 's/192.168.159.128:4000/20.46.87.183:5000/g' `grep 192.168.159.128:4000 -rl roles/download/defaults/main.yml`
# sed -i 's/192.168.159.128:4000/20.46.87.183:5000/g' `grep 192.168.159.128:4000 -rl roles/kubernetes-apps/ansible/defaults/main.yml `
# sed -i 's/192.168.159.128:4000/20.46.87.183:5000/g' `grep 192.168.159.128:4000 -rl roles/docker/templates/docker.service.j2`
# sed -i 's/192.168.159.128:4000/20.46.87.183:5000/g' `grep 192.168.159.128:4000 -rl roles/kubernetes/node/defaults/main.yml`

除此之外,该修改的剧本Kubespray,做了一下修改,去除不需要重复进行的下载和校验,有的是因为国内外网络差异,有的是因为剧本运行错误原因,本剧本都做了修改和注释,以下都是修改后的,直接拿来用即可。
1)注释掉了docker的校验和安装,因为国内网络不稳下载不下来,只要保证已经安装的docker版本符合开头提示的要求即可。

# vim roles/docker/tasks/main.yml

2)而且将内存校验和ip校验注释掉,

# vim roles/kubernetes/preinstall/tasks/verify-settings.yml

3)并且将配置epel源任务注释掉(剧本中第16个任务)

# vim roles/kubernetes/preinstall/tasks/main.yml

4)暴露kubernetes-dashboard服务,这里使用NodePort来暴露,其中的nodePort必须在30000-32767之间,本修改的选用的是30001,当然你可以根据自己的需求修改。

# vim roles/kubernetes-apps/ansible/templates/dashboard.yml.j2

在这里插入图片描述
5)此修改的剧本,开启的Helm的部署,后面会提到如何使用。

# vim inventory/group_vars/k8s-cluster.yml

在这里插入图片描述

  1. 此修改的剧本,注释掉了helm的Install/upgrade的任务。因为已经运行了helm的镜像容器,不影响。
# vim roles/kubernetes-apps/helm/tasks/main.yml
# vim extra_playbooks/roles/kubernetes-apps/helm/tasks/main.yml

在这里插入图片描述

4.2生成主机清单

# IP=(192.168.224.130 192.168.224.131 192.168.224.132 192.168.224.133)
# CONFIG_FILE=./inventory/inventory.cfg python3 ./contrib/inventory_builder/inventory.py ${IP[*]}

注:inventory.cfg文件就是kubespray的主机配置文件。kube-master就是kubernetes的master节点,kube-node就是node节点,etcd就是将数据库安装在哪个节点上,一般情况都是安装在master节点上,默认生成的[all]下的主机没有ansible_user=root,按照下图添加进去,剧本中对etcd的主机数目作了校验,不能是偶数。
然后修改主机清单:

# vim inventory/inventory.cfg

如下:

[all]
k8s-master01    ansible_host=192.168.224.130 ansible_user=root ip=192.168.224.130
k8s-master02    ansible_host=192.168.224.131 ansible_user=root ip=192.168.224.131
k8s-master03    ansible_host=192.168.224.132 ansible_user=root ip=192.168.224.132
k8s-node01      ansible_host=192.168.224.133 ansible_user=root ip=192.168.224.133

[kube-master]
k8s-master01
k8s-master02
k8s-master03

[kube-node]
k8s-node01

[etcd]
k8s-master01
k8s-master02
k8s-master03	 

[k8s-cluster:children]
kube-node
kube-master

4.3部署

# ansible -i inventory/inventory.cfg all -m ping
# ansible-playbook -i inventory/inventory.cfg cluster.yml -b -v --private-key=~/.ssh/id_rsa

如下结果,说明安装成功:
在这里插入图片描述

4.4登陆Kubernetes页面

使用火狐浏览器输入:
https://192.168.224.130:30001/
本示例选取三台master的一台IP作为登陆地址
在这里插入图片描述
这里提示需要令牌,下面获取令牌:

# kubectl get secret -n kube-system

在这里插入图片描述
选取name为clusterrole-aggregation-controller-token-*******样式的serect。

# kubectl describe secret -n kube-system clusterrole-aggregation-controller-token-77zx5

在这里插入图片描述
将上面显示token拷贝出来粘贴到令牌输入位置即可。
在这里插入图片描述

五、启用helm的server端

部署完Kubernetes查看各模块运行健康检查:

# kubectl get cs

如下图所示,正常:
在这里插入图片描述
初始化helm,结合tiller(helm server)容器镜像使用:

# helm init --service-account tiller --tiller-image 20.46.87.183:5000/kubespray24/tiller:v2.7.2 --skip-refresh

注:20.46.87.183:5000/kubespray24/tiller:v2.7.2取自repository的私有docker仓库,可以改成相对应的仓库地址及其版本号。
如下图所示,正常:
在这里插入图片描述
等待一会查看容器运行情况:

# kubectl get pod -n kube-system -l app=helm

如下图所示,正常:
在这里插入图片描述
查看helm的版本:

# helm version

在这里插入图片描述
如上图所示,查到helm的client和server的版本号,且都clean。

六、使用PVC模式挂载Ceph分布式集群存储

本次操作示例之前已经安装好了ceph分布式集群,参见ceph分布式集群在线搭建。在此基础上,将该集群挂载到Kubernetes上,然后运行测试pod。

6.1创建一个rbd的ceph pool

这里测试只创建128MB的pool:

# rbd create ceph-image -s 128

查看创建的pool的信息:

# rbd info rbd/ceph-image

在这里插入图片描述
去除除了layering的其他属性,因为其他属性影响PVC模式挂载CEPH。

# rbd feature disable ceph-image exclusive-lock, object-map, fast-diff, deep-flatten

在这里插入图片描述
注释:若是容器化部署的ceph集群加上如下俩个命令:

# rbd map ceph-image
# mkfs.ext4 /dev/rbd0

6.2创建ceph-secret

# mkdir k8s-ceph && cd k8s-ceph/

获取客户端的key:

# ceph auth get-key client.admin | base64 

在这里插入图片描述

# vim ceph-secret.yaml
# ceph-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
data:
  key: QVFDTjdXTmJ5dWU3T0JBQURST1VOS280Nk5HVFVON2lXV2VJT1E9PQo=
# kubectl create -f ceph-secret.yaml
# kubectl get secret

如下图所示,正常:
在这里插入图片描述

6.3创建ceph-pv

# vim ceph-pv.yaml
# ceph-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: ceph-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  rbd:
    monitors:
      - 192.168.224.130:6789
	  - 192.168.224.131:6789
	  - 192.168.224.132:6789
    pool: rbd
    image: ceph-image
    keyring: /opt/ceph-cluster/ceph.client.admin.keyring
    user: admin
    secretRef:
      name: ceph-secret
    fsType: ext4
    readOnly: false
  persistentVolumeReclaimPolicy: Recycle
# kubectl create -f ceph-pv.yaml
# kubectl get pv

如下图所示,正常:
在这里插入图片描述

6.4创建ceph-pvc

# vim ceph-pvc.yaml
# ceph-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
# kubectl create -f ceph-pvc.yaml
# kubectl get pvc

如下图所示,正常:
在这里插入图片描述

# kubectl get pv,pvc

在这里插入图片描述
上图所示,PV和PVC状态都是Bound绑定状态,说明无误。

6.5创建测试ceph-pod

PV和PVC状态都是Bound绑定状态,无误,下面运行一个测试pod。

# vim ceph-pod.yaml
# ceph-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: ceph-pod1
spec:
  containers:
  - name: ceph-busybox1
    image: 20.46.87.183:5000/kubespray24/busybox:latest
    command: ["sleep", "600000"]
    volumeMounts:
    - name: ceph-vol1
      mountPath: /usr/share/busybox
      readOnly: false
  volumes:
  - name: ceph-vol1
    persistentVolumeClaim:
      claimName: ceph-claim
# kubectl create -f ceph-pod.yaml
# kubectl get pv,pvc,pods

在这里插入图片描述
如上ceph-pod正常running,说明Kubernetes挂载ceph存储,并且运行pod成功无误。
可以再运行一个pod测试。

# vim ceph-pod2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: ceph-pod2
spec:
  containers:
  - name: ceph-tomcat1
    image: 20.46.87.183:5000/kubespray24/tomcat:latest
    command: ["sleep", "600000"]
    volumeMounts:
    - name: ceph-vol2
      mountPath: /usr/share/tomcat
      readOnly: false
  volumes:
  - name: ceph-vol2
    persistentVolumeClaim:
      claimName: ceph-claim
# kubectl create -f ceph-pod2.yaml

最后查看运行状态,正常running即可。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值