Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲
目錄
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9UFWlFDZuJGashFZwhnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zN2EDOwEDN2EDNykDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
一、簡介
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源,此步驟略過)
- 修改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://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 [email protected]
# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
四、部署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
- 此修改的劇本,注釋掉了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即可。