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节点使用。
三、基础环境配置(每台机器均执行以下操作)
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源,此步骤略过)
- 修改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
- 修改pip源配置(修改成repository的源)
# mkdir /root/.pip && vi /root/.pip/pip.conf
添加以下内容:
[global]
index-url=http:/xxxxx/pypi/packages/simple
[install]
trusted-host =xxxxx
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 xxxxxx:5000
# systemctl daemon-reload && systemctl enable docker && systemctl start docker && systemctl status docker
# curl -X GET http://xxxx:5000/v2/_catalog
正常如下返回数据即可:
{"repositories":[………]}
3.5添加ntp时钟服务器
# vim /etc/ntp.conf
### 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](https://download.csdn.net/download/liuyanwuyu/10684927),解压到仓库即可,下载链接只有七天,逾期不候。具体怎么解压,怎么安装仓库,这里不再叙述,可以参考[《Openstack的HA高可用容器化部署(使用kolla-ansible部署)+内置ceph集群存储》](https://blog.csdn.net/liuyanwuyu/article/details/80821677)一文里面有描述。
修改原有的仓库地址为自己要用的仓库地址,其中有以下四处需要改动,将文件中原有的仓库地址(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/xxxxxx:5000/g’ grep 192.168.159.128:4000 -rl roles/download/defaults/main.yml
sed -i ‘s/192.168.159.128:4000/xxxxxx:5000/g’ grep 192.168.159.128:4000 -rl roles/kubernetes-apps/ansible/defaults/main.yml
sed -i ‘s/192.168.159.128:4000/xxxxxx:5000/g’ grep 192.168.159.128:4000 -rl roles/docker/templates/docker.service.j2
sed -i ‘s/192.168.159.128:4000/xxxxxx: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

6) 此修改的剧本,注释掉了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 xxxxxx: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分布式集群在线搭建](https://blog.csdn.net/liuyanwuyu/article/details/82825251)。在此基础上,将该集群挂载到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: xxxxxx:5000/kubespray24/busybox:latest
command: [“sleep”, “600000”]
volumeMounts:- name: ceph-vol1
mountPath: /usr/share/busybox
readOnly: false
volumes:
- name: ceph-vol1
- 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: xxxxxx:5000/kubespray24/tomcat:latest
command: [“sleep”, “600000”]
volumeMounts:- name: ceph-vol2
mountPath: /usr/share/tomcat
readOnly: false
volumes:
- name: ceph-vol2
- name: ceph-vol2
persistentVolumeClaim:
claimName: ceph-claim
kubectl create -f ceph-pod2.yaml
最后查看运行状态,正常running即可。