kubernetes从1.3.7到1.4, 从1.4到1.6.2. 每个版本都有不少坑, 爬了很多文档,也问了很多大神.

开始记录几个比较重要的组件吧, 慢慢写, 慢慢补充…

也给其他人一点参考

一. 环境

1. OS

root@kb-node1:~# lsb_release -a
LSB Version:    core-9.20160110ubuntu0.2-amd64:core-9.20160110ubuntu0.2-noarch:security-9.20160110ubuntu0.2-amd64:security-9.20160110ubuntu0.2-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.2 LTS
Release:    16.04
Codename:   xenial

2. Docker

root@kb-node1:~# docker version
Client:
 Version:      1.13.0
 API version:  1.25
 Go version:   go1.7.3
 Git commit:   49bf474
 Built:        Tue Jan 17 09:50:17 2017
 OS/Arch:      linux/amd64

Server:
 Version:      1.13.0
 API version:  1.25 (minimum version 1.12)
 Go version:   go1.7.3
 Git commit:   49bf474
 Built:        Tue Jan 17 09:50:17 2017
 OS/Arch:      linux/amd64
 Experimental: false

3. kubernetes

root@kb-node1:~# kubeadm version
kubeadm version: version.Info{Major:"1", Minor:"6", GitVersion:"v1.6.2", GitCommit:"477efc3cbe6a7effca06bd1452fa356e2201e1ee", GitTreeState:"clean", BuildDate:"2017-04-19T20:22:08Z", GoVersion:"go1.7.5", Compiler:"gc", Platform:"linux/amd64"}

4. Server

kb-node1 172.16.30.106
kb-node2 172.16.30.107

二. 安装

1. Ceph简介

不管你是想为云平台提供Ceph 对象存储和/或 Ceph 块设备,还是想部署一个 Ceph 文件系统或者把 Ceph 作为他用,所有 Ceph 存储集群的部署都始于部署一个个 Ceph 节点、网络和 Ceph 存储集群。 Ceph 存储集群至少需要一个 Ceph Monitor 和两个 OSD 守护进程。而运行 Ceph 文件系统客户端时,则必须要有元数据服务器( Metadata Server )。

Ceph OSDs: Ceph OSD 守护进程( Ceph OSD )的功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD 守护进程的心跳来向 Ceph Monitors 提供一些监控信息。当 Ceph 存储集群设定为有2个副本时,至少需要2个 OSD 守护进程,集群才能达到 active+clean 状态( Ceph 默认有3个副本,但你可以调整副本数)。

Monitors: Ceph Monitor维护着展示集群状态的各种图表,包括监视器图、 OSD 图、归置组( PG )图、和 CRUSH 图。 Ceph 保存着发生在Monitors 、 OSD 和 PG上的每一次状态变更的历史信息(称为 epoch )。

MDSs: Ceph 元数据服务器( MDS )为 Ceph 文件系统存储元数据(也就是说,Ceph 块设备和 Ceph 对象存储不使用MDS )。元数据服务器使得 POSIX 文件系统的用户们,可以在不对 Ceph 存储集群造成负担的前提下,执行诸如 ls、find 等基本命令。

2. 安装

wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add - #添加 release key

echo deb https://download.ceph.com/debian-jewel/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list #添加Ceph软件包源

apt-get update && apt-get install ceph-deploy #更新仓库, 安装

3. 创建用户

#从 Infernalis 版开始,ceph用户已经被占用了,不要创建ceph用户, 如果有, 请删除......
sudo useradd -d /home/{username} -m {username}
sudo passwd {username}

#确保各 Ceph 节点上新创建的用户都有 sudo 权限。

echo "{username} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/{username}
sudo chmod 0440 /etc/sudoers.d/{username}

4.设置证书登陆

#用新建的用户生成 SSH 密钥对口令即为空:

ssh-keygen

Generating public/private key pair.
Enter file in which to save the key (/cephd/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /cephd/.ssh/id_rsa.
Your public key has been saved in /cephd/.ssh/id_rsa.pub.
#把公钥拷贝到各 Ceph 节点,把下列命令中的 {username} 替换成前面创建部署 Ceph 的用户里的用户名。

ssh-copy-id cephd@kb-node1
ssh-copy-id cephd@kb-node2

#修改 ceph-deploy 管理节点上的 ~/.ssh/config 文件,这样 ceph-deploy 就能用你所建的用户名登录 Ceph 节点了,而无需每次执行 ceph-deploy 都要指定 --username {username} 。这样做同时也简化了 ssh 和 scp 的用法。把 {username} 替换成你创建的用户名。

vim ~/.ssh/config
Host kb-node1
   Hostname kb-node1
   User cephd
Host kb-node2
   Hostname kb-node2
   User cephd

5. 清理

#如果之前有安装或需要重新装, 则需要清理干净.
ceph-deploy purgedata kb-node1 kb-node2
ceph-deploy forgetkeys
ceph-deploy purge kb-node1 kb-node2 #清除Ceph 安装包

6. 安装ceph

mkdir /opt/ceph-install/

#创建集群
ceph-deploy new kb-node1

7. 修改安装节点数

#ceph 集群默认副本数为三个,当前我只有两台机器, 所以修改配置文件为2个及诶单
vim /opt/ceph-install/ceph.conf
[global]
osd pool default size = 2 #添加此行配置

8. 两个节点上安装ceph包

ceph-deploy install kb-node1 kb-node2

9. 初始化ceph monitor node

#配置初始 monitor(s)、并收集所有密钥
ceph-deploy mon create-initial

#初始化后会在当前目录生成一些文件

cephd@kb-node1:/opt/ceph-install$ ls
ceph.bootstrap-mds.keyring  ceph.bootstrap-rgw.keyring  ceph.conf             ceph.mon.keyring
ceph.bootstrap-osd.keyring  ceph.client.admin.keyring   ceph-deploy-ceph.log  release.asc

10. 创建目录

#登录到 Ceph 节点、并给 OSD 守护进程创建一个目录。把目录用于 OSD 守护进程
kb-node1: mkdir /osd0
kb-node2: mkdir /osd1

11. 执行Prepare操作

ceph-deploy osd prepare kb-node1:/osd0 kb-node2:/osd1

12. 激活ceph OSD

ceph-deploy osd activate kb-node1:/osd0 kb-node2:/osd1

13. 执行ceph admin

#此命令将各个.keyring同步到各个节点上, 以便可以在各个节点上使用ceph命令连接到monitor
ceph-deploy admin admin kb-node1 kb-node2

sudo chmod +r /etc/ceph/ceph.client.admin.keyring

14. 查看节点状态

ceph osd tree
ceph -s
ceph health
#等 peering 完成后,集群应该达到 active + clean 状态。

15. ext4需要添加配置到ceph.conf

osd max object name len = 256
osd max object namespace len = 64

二. 创建mds

ceph-deploy mds create kb-node1 kb-node2

1. 创建fs

创建 CEPH 文件系统

存储池

一个 Ceph 文件系统需要至少两个 RADOS 存储池,一个用于数据、一个用于元数据。配置这些存储池时需考虑:

为元数据存储池设置较高的副本水平,因为此存储池丢失任何数据都会导致整个文件系统失效。

为元数据存储池分配低延时存储器(像 SSD ),因为它会直接影响到客户端的操作延时。

ceph osd pool create cephfs_data 128
ceph osd pool create cephfs_metadata 128
ceph fs new opfs cephfs_metadata cephfs_data

创建完成即可像普通网络磁盘一样挂载

2. 挂载

挂载时需要制定secretfile文件,它的来源是/etc/ceph/ceph.client.admin.keyring文件中的key字段的值(base64加密)

cat /etc/ceph/ceph.client.admin.keyring |grep key|awk -F" " '{print $3}' > /etc/ceph/admin.secret

mount -t ceph kb-node1:6789:/ /mnt -o name=admin,secretfile=/etc/ceph/admin.secret

三. 集成到kubernetes中

1. 创建pv&pvc

kubectl create -f ceph-pv.conf

ceph-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  cephfs:
    monitors:
      - 172.16.30.106:6789
    path: /mysql
    user: admin
    secretFile: "/etc/ceph/admin.secret"
    readOnly: false
  persistentVolumeReclaimPolicy: Recycle

配置中的secretfile也可以直接通过kubectl创建为secret来替换

kubectl create -f ceph-secret.yaml

ceph-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret-beets
data:
  key: "SECRET-KEY-B64"

创建后修改ceph-pv.yaml

secretFile: "/etc/ceph/admin.secret"
secretRef:
        name: ceph-secret

kubectl create -f ceph-pvc.conf

ceph-pvc.yaml

  kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-claim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

2. 创建mysql做测试

kubectl create -f mysql.yaml

mysql.yaml

apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    name: mysql
spec:
  containers:
    - resources:
        limits :
          cpu: 0.5
      image: mysql
      name: mysql
      args:
        - "--ignore-db-dir"
        - "lost+found"
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: 123456
      ports:
        - containerPort: 3306
          name: mysql
      volumeMounts:
        - name: mysql-opfs
          mountPath: /var/lib/mysql
  volumes:
    - name: mysql-opfs
      persistentVolumeClaim:
        claimName: mysql-claim

3. 验证

在另一个节点挂载到/mnt目录后, 创建几个文件 a b c

root@kb-node2:/mnt/mysql# ls
a         c           client-cert.pem  ibdata1      ibtmp1  performance_schema  server-cert.pem
auto.cnf  ca-key.pem  client-key.pem   ib_logfile0  insoz   private_key.pem     server-key.pem
b         ca.pem      ib_buffer_pool   ib_logfile1  mysql   public_key.pem      sys

查看mysql容器中是否存在

root@kb-node1:/opt/yaml# kubectl exec mysql ls /var/lib/mysql/
a
auto.cnf
b
c
ca-key.pem
ca.pem
client-cert.pem
client-key.pem
ib_buffer_pool
ib_logfile0
ib_logfile1
ibdata1
ibtmp1
insoz
mysql
performance_schema
private_key.pem
public_key.pem
server-cert.pem
server-key.pem
sys

测试证明cephFS可以ReadWriteMany

4. Secret, PV, PVC

root@kb-node1:~# kubectl get secret
NAME                  TYPE                                  DATA      AGE
default-token-4jdlj   kubernetes.io/service-account-token   3         5d
root@kb-node1:~# kubectl get pv
NAME       CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM                 STORAGECLASS   REASON    AGE
mysql-pv   1Gi        RWX           Recycle         Bound     default/mysql-claim                            22m
root@kb-node1:~# kubectl get pvc
NAME          STATUS    VOLUME     CAPACITY   ACCESSMODES   STORAGECLASS   AGE
mysql-claim   Bound     mysql-pv   1Gi        RWX                          22m

感谢@tonybai, 填补了很多坑…