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各个组件的版本说明如下:
# 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
(假如你没有yum源和pip源,此步骤略过)
# 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
# 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
以下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"]
}
添加信任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":[………]}
# vim /etc/ntp.conf
# systemctl enable ntpd.service && systemctl start ntpd.service && systemctl status ntpd.service
# ntpq -p
# modprobe br_netfilter
# ls /proc/sys/net/bridge
# cat >> /etc/sysctl.conf <
# sysctl -w net.ipv4.ip_forward=1
# cat >> /etc/hosts <
# 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
首先将附件一(kubespray-2.4.0.tar.gz)传到k8s-master01节点的root目录下,然后解压:
# tar –zxvf kubespray-2.4.0.tar.gz
# cd kubespray-2.4.0
这里制作好了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
# vim roles/kubernetes-apps/helm/tasks/main.yml
# vim extra_playbooks/roles/kubernetes-apps/helm/tasks/main.yml
# 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
# ansible -i inventory/inventory.cfg all -m ping
# ansible-playbook -i inventory/inventory.cfg cluster.yml -b -v --private-key=~/.ssh/id_rsa
使用火狐浏览器输入:
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
部署完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 version
如上图所示,查到helm的client和server的版本号,且都clean。
本次操作示例之前已经安装好了ceph分布式集群,参见ceph分布式集群在线搭建。在此基础上,将该集群挂载到Kubernetes上,然后运行测试pod。
这里测试只创建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
# rbd map ceph-image
# mkfs.ext4 /dev/rbd0
# 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
# 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
# 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绑定状态,说明无误。
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即可。