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节点使用。

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

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:/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

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c00b8406f61bbb4a8561c5c01e4bed53.png)

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

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2e8ac6ab76ec70e7db2eca6eaa788326.png)

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

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f2021c6548749b9740c9f91565616777.png)
5)此修改的剧本,开启的Helm的部署,后面会提到如何使用。

vim inventory/group_vars/k8s-cluster.yml

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5c238a6153851abb2e22074e004cf369.png)

6) 此修改的剧本,注释掉了helm的Install/upgrade的任务。因为已经运行了helm的镜像容器,不影响。

vim roles/kubernetes-apps/helm/tasks/main.yml

vim extra_playbooks/roles/kubernetes-apps/helm/tasks/main.yml

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f692d9021a8b56cf07277fe5f6ac041d.png)

### 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

如下结果,说明安装成功:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/cbf0c091cb6bbc89265d491f12c3ddc4.png)

### 4.4登陆Kubernetes页面
使用火狐浏览器输入:
https://192.168.224.130:30001/
本示例选取三台master的一台IP作为登陆地址
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fb31bbb9e16d28e22c8f69e64851b434.png)
这里提示需要令牌,下面获取令牌:

kubectl get secret -n kube-system

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f9ade6be684bb88023efc1d47b5e9f9f.png)
选取name为clusterrole-aggregation-controller-token-*******样式的serect。

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

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4c47c4d51ec667229dcaba4169ae68ec.png)
将上面显示token拷贝出来粘贴到令牌输入位置即可。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0b58cc318734bd87355b7f7ae140a2d5.png)

## 五、启用helm的server端
部署完Kubernetes查看各模块运行健康检查:

kubectl get cs

如下图所示,正常:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/99740ba01188bd1621a0f579b4a51632.png)
初始化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仓库,可以改成相对应的仓库地址及其版本号。**
如下图所示,正常:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f75fa59befb3791b96619dd27f6bec91.png)
等待一会查看容器运行情况:

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

如下图所示,正常:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/aef3bfbe2e13026f10ecb5c1361d5d4e.png)
查看helm的版本:

helm version

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1071c83da90faf51f2fc0e00666cbe45.png)
如上图所示,查到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

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/95499e803abcefdd65ea6cfe2528a55c.png)
去除除了layering的其他属性,因为其他属性影响PVC模式挂载CEPH。

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

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2f143a923a26de9d1de0b2166ee41c57.png)
注释:若是容器化部署的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

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1534f43d594fc26a4e66f35b99413533.png)

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

如下图所示,正常:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/44aa8ed17138cc4f9539cc74c488f876.png)

### 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

如下图所示,正常:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6af02a5df3b968a222c36d2ae6017074.png)

### 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

如下图所示,正常:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d2cd137908fa721465a356275fb49e85.png)

kubectl get pv,pvc

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6c582c2c78976bf776ed2c698c2449ed.png)
上图所示,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
    persistentVolumeClaim:
    claimName: ceph-claim

kubectl create -f ceph-pod.yaml

kubectl get pv,pvc,pods

![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e3ddd857545cd83c8a8323b82d8b0587.png)
如上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
    persistentVolumeClaim:
    claimName: ceph-claim

kubectl create -f ceph-pod2.yaml

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值