天天看點

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

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

目錄

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的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲

Kubernetes各個元件的版本說明如下:

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

三、基礎環境配置(每台機器均執行以下操作)

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的那行,如下圖所示:

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

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

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

然後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
           

如下圖所示,

Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲
# systemctl enable ntpd.service && systemctl start ntpd.service && systemctl status ntpd.service
# ntpq -p
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲

3.6加載br_netfilter

# modprobe br_netfilter
# ls /proc/sys/net/bridge
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲
# 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
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲
# 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
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲

5)此修改的劇本,開啟的Helm的部署,後面會提到如何使用。

# vim inventory/group_vars/k8s-cluster.yml
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲
  1. 此修改的劇本,注釋掉了helm的Install/upgrade的任務。因為已經運作了helm的鏡像容器,不影響。
# vim roles/kubernetes-apps/helm/tasks/main.yml
# vim extra_playbooks/roles/kubernetes-apps/helm/tasks/main.yml
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲

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
           

如下結果,說明安裝成功:

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

4.4登陸Kubernetes頁面

使用火狐浏覽器輸入:

https://192.168.224.130:30001/

本示例選取三台master的一台IP作為登陸位址

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

這裡提示需要令牌,下面擷取令牌:

# kubectl get secret -n kube-system
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲

選取name為clusterrole-aggregation-controller-token-*******樣式的serect。

# kubectl describe secret -n kube-system clusterrole-aggregation-controller-token-77zx5
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲

将上面顯示token拷貝出來粘貼到令牌輸入位置即可。

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

五、啟用helm的server端

部署完Kubernetes檢視各子產品運作健康檢查:

# kubectl get cs
           

如下圖所示,正常:

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

初始化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倉庫,可以改成相對應的倉庫位址及其版本号。

如下圖所示,正常:

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

等待一會檢視容器運作情況:

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

如下圖所示,正常:

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

檢視helm的版本:

# helm version
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲

如上圖所示,查到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
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲

去除除了layering的其他屬性,因為其他屬性影響PVC模式挂載CEPH。

# rbd feature disable ceph-image exclusive-lock, object-map, fast-diff, deep-flatten
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲

注釋:若是容器化部署的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 
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲
# 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
           

如下圖所示,正常:

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

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
           

如下圖所示,正常:

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

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
           

如下圖所示,正常:

Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲
# kubectl get pv,pvc
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲

上圖所示,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
           
Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲Kubernetes的HA高可用容器化部署(使用Kubespray) 以及使用PVC模式挂載Ceph叢集存儲

如上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即可。

繼續閱讀