暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kubernetes集群扩容ceph存储

云时代IT运维 2019-05-26
1071

1. kubernetes节点管理:

  在本篇博文中,主要讲解如下几个知识点和实践经验,供大家参考:

  1. ceph集群扩容OSD磁盘:

  2. kubernetes集群扩容node节点:

  3. 介绍K9S工具的使用:

1. ceph集群扩容OSD磁盘:

  首先我们介绍一下如何给一个ceph存储扩容osd磁盘。我这里的实验是通过ceph-deploy管理工具来实现的。因为我的ceph分布式存储集群当初就是通过ceph-deploy管理工具部署的;

  要让一个新的节点成为ceph osd节点,首先需要完成以下工作:

   1.  新节点最好有独立的磁盘(/dev/sdb)类似,如果能有一块SSD盘更好,可以作为journal卷来实现ceph的缓存;

   2.  新节点需要同步原有的节点上面的hosts文件;

   3.  新节点需要配置ssh免密钥设置;

   4.  需要关闭selinux和防火墙设置;

   5.  需要配置时间同步

  以上的配置在上一篇的ceph存储搭建过程中已经讲过了,此处不再描述;

  在ceph管理机器上面安装新节点的ceph软件:

ceph-deploy install k8sdemo-ceph5

  在ceph新增节点上面检查ceph软件是否安装成功:

[root@k8sdemo-ceph5 ceph]# rpm -qa|grep ceph
ceph-common-10.2.11-0.el7.x86_64
ceph-osd-10.2.11-0.el7.x86_64
ceph-radosgw-10.2.11-0.el7.x86_64
ceph-release-1-1.el7.noarch
libcephfs1-10.2.11-0.el7.x86_64
python-cephfs-10.2.11-0.el7.x86_64
ceph-selinux-10.2.11-0.el7.x86_64
ceph-mds-10.2.11-0.el7.x86_64
ceph-10.2.11-0.el7.x86_64
ceph-base-10.2.11-0.el7.x86_64
ceph-mon-10.2.11-0.el7.x86_64

  在ceph管理机器上面推送配置文件到新增加的osd节点:

[root@k8sdemo-ceph1 cluster]# ceph-deploy --overwrite-conf config push k8sdemo-ceph5

  在ceph管理机器上面推送认证信息到新增加的osd节点:

[root@k8sdemo-ceph1 cluster]# ceph-deploy admin k8sdemo-ceph5
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (1.5.39): /usr/bin/ceph-deploy admin k8sdemo-ceph5
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fc81afc5290>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  client                        : ['k8sdemo-ceph5']
[ceph_deploy.cli][INFO  ]  func                          : <function admin at 0x7fc81bcdaa28>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to k8sdemo-ceph5
[k8sdemo-ceph5][DEBUG ] connected to host: k8sdemo-ceph5
[k8sdemo-ceph5][DEBUG ] detect platform information from remote host
[k8sdemo-ceph5][DEBUG ] detect machine type
[k8sdemo-ceph5][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[root@k8sdemo-ceph1 cluster]#

  在ceph新增osd节点上面初始化osd盘:

fdisk /dev/sda
m 查看帮助
p 打印分区
n 创建分区
w 保存配置
reboot  重启系统分区生效
mkfs.xfs -f /dev/sda4 格式化分区

  在ceph管理机器上面初始化新增osd节点磁盘:

[root@k8sdemo-ceph1 cluster]# ceph-deploy osd prepare k8sdemo-ceph5:/dev/sda4

  在ceph管理机器上面激活新节点的osd磁盘:

[root@k8sdemo-ceph1 cluster]# ceph-deploy osd activate k8sdemo-ceph5:/dev/sda4

  查看osd节点的状态:

[root@k8sdemo-ceph1 cluster]# ceph osd tree
ID WEIGHT  TYPE NAME              UP/DOWN REWEIGHT PRIMARY-AFFINITY
-5 0.34869 host k8sdemo-ceph5
 4 0.34869     osd.4                   up  1.00000          1.00000
-1 4.52316 root default
-2 1.52179     host k8sdemo-ceph1
 0 1.52179         osd.0               up  1.00000          1.00000
-3 1.52179     host k8sdemo-ceph2
 1 1.52179         osd.1               up  1.00000          1.00000
-4 0.67628     host k8sdemo-ceph3
 2 0.67628         osd.2               up  1.00000          1.00000
-6 0.80330     host k8sdemo-ceph4
 3 0.80330         osd.3               up  1.00000          1.00000
[root@k8sdemo-ceph1 cluster]#

  我们增加了osd节点,并不会影响到kubernetes里面的StorageClass资源,原来的StorageClass资源仍然可以正常使用。我们平时在kubernetes里面创建的pvc,如何不指定storageclass,默认是通过dynamic这个sc创建的,为什么了?

[root@master-01 ceph]# cat ceph-storageclass.yaml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: dynamic
  annotations:
    storageclass.beta.kubernetes.io/is-default-class: "true"  #注意这一行有一个default-class: true作用就是默认的sc
provisioner: kubernetes.io/rbd
parameters:
  monitors: 192.168.32.224:6789,192.168.32.225:6789,192.168.32.234:6789
  adminId: admin
  adminSecretName: ceph-secret
  adminSecretNamespace: kube-system
  pool: kube
  userId: kube
  userSecretName: ceph-user-secret
[root@master-01 ceph]#
# 也可以通过打补丁的方式,让sc成为默认
kubectl patch storageclass dynamimc -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
# 创建pvc做测试
[root@master-01 ceph]# cat ceph-pvc-test.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Mi
[root@master-01 ceph]# kubectl get pvc test-pvc
NAME       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-pvc   Bound    pvc-804577e9-7b8b-11e9-a1c9-480fcf659569   1Mi        RWO            dynamic        21s
[root@master-01 ceph]# kubectl get pv pvc-804577e9-7b8b-11e9-a1c9-480fcf659569
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS   REASON   AGE
pvc-804577e9-7b8b-11e9-a1c9-480fcf659569   1Mi        RWO            Delete           Bound    default/test-pvc   dynamic                 44s

2. kubernetes集群扩容计算节点:

  当初我们安装kubernetes集群的时候是通过ansible-playbook的方式安装的,使用的是github上面的安装脚本。参考资料地址为: https://github.com/easzlab/kubeasz
  扩容kubernetes计算节点非常简单,大体的过程如下:

  1. 需要配置此机器可以通过ansible服务器端免密钥登录,配置hosts文件;

# 增加节点
easzctl add-node 192.168.32.211
# 我第一次执行这个命令的时候,还有报错,经过分析是因为模板文件的问题,
TASK [docker : docker国内镜像加速] ********************************************************************************************************
fatal: [192.168.32.211]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'REG_MIRROR_2' is undefined"}
这个报错的解决方案是:
vim docker/templates/daemon.json.j2
{
  "registry-mirrors": ["{{ REG_MIRROR_1 }}"],
  "max-concurrent-downloads": 10,
  "log-driver": "{{ LOG_DRIVER }}",
  "log-level": "{{ LOG_LEVEL }}",
  "log-opts": {
    "max-size": "{{ LOG_MAX_SIZE }}",
    "max-file": "{{ LOG_MAX_FILE }}"
    },
  "data-root": "{{ STORAGE_DIR }}"
  {% if ENABLE_REMOTE_API %}
  , "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
  {% endif %}
}
把这里的"{{ REG_MIRROR_2 }}"删除掉就行
# 查看新增加的节点
[root@node-01 ~]# kubectl get node
NAME           STATUS                     ROLES    AGE     VERSION
192.168.32.210   Ready                      node     4h9m    v1.14.1
192.168.32.211   Ready                      node     4h17m   v1.14.1
192.168.32.223   Ready                      node     46d     v1.14.1
192.168.32.224   Ready                      node     157m    v1.14.1
192.168.32.225   Ready                      node     145m    v1.14.1
192.168.32.226   Ready,SchedulingDisabled   master   46d     v1.14.1
192.168.32.227   Ready,SchedulingDisabled   master   46d     v1.14.1
192.168.32.228   Ready,SchedulingDisabled   master   46d     v1.14.1
192.168.32.229   Ready                      node     46d     v1.14.1
192.168.32.231   Ready                      node     46d     v1.14.1
192.168.32.232   Ready                      node     46d     v1.14.1
192.168.32.233   Ready                      node     46d     v1.14.1
192.168.32.234   Ready                      node     142m    v1.14.1
[root@node-01 ~]#

  2. 使用ansible-playbook二进制文件安装k8s的方式是比较常见的,同时ansible也是运维人员必须掌握的批量管理、配置管理工具,ansible有ad-hoc和ansible-playbook两种使用方式,ad-hoc就是命令行的使用方式,有很多模块可以使用,常见的包括 shell ping yum copy cron等,后续有时间我会专门写一篇关于ansible的博文;使用ansible-playbook安装k8s的主要步骤如下:

yum -y install ansible  # 安装ansible
git clone https://github.com/easzlab/kubeasz.git  #下载k8s二进制安装的playbook
[root@master-01 ansible]# ll
total 88
-rw-r--r--.  1 root root   499 Apr  4 23:05 01.prepare.yml
-rw-r--r--.  1 root root    58 Apr  4 23:05 02.etcd.yml
-rw-r--r--.  1 root root    87 Apr  4 23:05 03.docker.yml
-rw-r--r--.  1 root root   532 Apr  4 23:05 04.kube-master.yml
-rw-r--r--.  1 root root    72 Apr  4 23:05 05.kube-node.yml
-rw-r--r--.  1 root root   346 Apr  4 23:05 06.network.yml
-rw-r--r--.  1 root root    77 Apr  4 23:05 07.cluster-addon.yml
-rw-r--r--.  1 root root  1521 Apr  4 23:05 11.harbor.yml
-rw-r--r--.  1 root root   411 Apr  4 23:05 22.upgrade.yml
-rw-r--r--.  1 root root  1394 Apr  4 23:05 23.backup.yml
-rw-r--r--.  1 root root  1391 Apr  4 23:05 24.restore.yml
-rw-r--r--.  1 root root  1723 Apr  4 23:05 90.setup.yml
-rw-r--r--.  1 root root  5941 Apr  4 23:05 99.clean.yml
-rw-r--r--.  1 root root 10283 Apr  4 23:05 ansible.cfg
drwxr-xr-x.  2 root root  4096 Apr  5 10:02 bin
drwxr-xr-x.  4 root root    36 Apr  4 23:05 dockerfiles
drwxr-xr-x.  8 root root    92 Apr  4 23:05 docs
drwxr-xr-x.  2 root root   239 May 13 22:15 down
drwxr-xr-x.  2 root root   254 Apr  4 23:05 example
-rw-r--r--   1 root root  2492 May 21 17:40 hosts
drwxr-xr-x. 14 root root   218 Apr  4 23:05 manifests
drwxr-xr-x.  2 root root   245 Apr  4 23:05 pics
-rw-r--r--.  1 root root  5056 Apr  4 23:05 README.md
drwxr-xr-x. 22 root root  4096 Apr  4 23:05 roles
drwxr-xr-x.  2 root root   272 Apr  4 23:05 tools
[root@master-01 ansible]#
# 首先需要配置hosts文件
# 集群部署节点:一般为运行ansible 脚本的节点
# 变量 NTP_ENABLED (=yes/no) 设置集群是否安装 chrony 时间同步
[deploy]
192.168.32.226 NTP_ENABLED=no  #替换你的安装ansible的机器的ip,也就是部署机的ip
# etcd集群请提供如下NODE_NAME,注意etcd集群必须是1,3,5,7...奇数个节点
[etcd]
192.168.32.226 NODE_NAME=etcd1
192.168.32.227 NODE_NAME=etcd2
192.168.32.228 NODE_NAME=etcd3  # 替换你准备安装etcd节点的ip
[kube-master]
192.168.32.226
192.168.32.227
192.168.32.228     #master节点的ip
[kube-node]
192.168.32.229
192.168.32.231
192.168.32.232
192.168.32.233
192.168.32.223       # node节点的ip
# 参数 NEW_INSTALL:yes表示新建,no表示使用已有harbor服务器
# 如果不使用域名,可以设置 HARBOR_DOMAIN=""
[harbor]
#192.168.1.8 HARBOR_DOMAIN="harbor.yourdomain.com" NEW_INSTALL=no
# 负载均衡(目前已支持多于2节点,一般2节点就够了) 安装 haproxy+keepalived
[lb]
192.168.32.227 LB_ROLE=backup
192.168.32.226 LB_ROLE=master
# 安装haproxy的机器,因为api-server组件需要有vip访问
#【可选】外部负载均衡,用于自有环境负载转发 NodePort 暴露的服务等
[ex-lb]
#192.168.1.6 LB_ROLE=backup EX_VIP=192.168.1.250
#192.168.1.7 LB_ROLE=master EX_VIP=192.168.1.250
[all:vars]
# ---------集群主要参数---------------
#集群部署模式:allinone, single-master, multi-master
DEPLOY_MODE=multi-master
# 集群 MASTER IP即 LB节点VIP地址,为区别与默认apiserver端口,设置VIP监听的服务端口8443
# 公有云上请使用云负载均衡内网地址和监听端口
MASTER_IP="192.168.32.222"  #指定vip地址
KUBE_APISERVER="https://{{ MASTER_IP }}:8443"
# 集群网络插件,目前支持calico, flannel, kube-router, cilium
CLUSTER_NETWORK="flannel"
# 服务网段 (Service CIDR),注意不要与内网已有网段冲突
SERVICE_CIDR="10.200.0.0/16"
# POD 网段 (Cluster CIDR),注意不要与内网已有网段冲突
CLUSTER_CIDR="172.30.0.0/16"
# 服务端口范围 (NodePort Range)
NODE_PORT_RANGE="20000-40000"
# kubernetes 服务 IP (预分配,一般是 SERVICE_CIDR 中第一个IP)
CLUSTER_KUBERNETES_SVC_IP="10.200.0.1"
# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
CLUSTER_DNS_SVC_IP="10.200.0.2"
# 集群 DNS 域名
CLUSTER_DNS_DOMAIN="cluster.local."
# ---------附加参数--------------------
NODE_PORT_RANGE="20000-40000"
# kubernetes 服务 IP (预分配,一般是 SERVICE_CIDR 中第一个IP)
CLUSTER_KUBERNETES_SVC_IP="10.200.0.1"
# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
CLUSTER_DNS_SVC_IP="10.200.0.2"
# 集群 DNS 域名
CLUSTER_DNS_DOMAIN="cluster.local."
# ---------附加参数--------------------
#默认二进制文件目录
bin_dir="/opt/kube/bin"
#证书目录
ca_dir="/etc/kubernetes/ssl"
#部署目录,即 ansible 工作目录,建议不要修改
base_dir="/etc/ansible"
[ceph]
192.168.32.224
192.168.32.225
192.168.32.234

  请确保各节点时区设置一致、时间同步。 如果你的环境没有提供NTP 时间同步,推荐集成安装chrony。

3. k9s工具的使用:

  K9s提供了一个基于curses的终端UI,可与您的Kubernetes集群进行交互。该项目的目的是使您可以更轻松地在管理您的应用程序。K9s不断观察Kubernetes的变化,并提供后续命令以与观察到的资源进行交互。
github地址: https://github.com/derailed/k9s

wget https://github-production-release-asset-2e65be.s3.amazonaws.com/167596393/4ad5c780-6fec-11e9-9a6b-c1e60f2e6f34?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20190521%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190521T124148Z&X-Amz-Expires=300&X-Amz-Signature=c61df48222f903ba824c2f974a40bc14532648c04a72cf968e99bb1803ca6c6a&X-Amz-SignedHeaders=host&actor_id=27935695&response-content-disposition=attachment%3B%20filename%3Dk9s_0.6.5_Linux_x86_64.tar.gz&response-content-type=application%2Foctet-stream

tar xzvf k9s_0.6.5_Linux_x86_64.tar.gz
K9s keeps its configurations in a dot file in your home directory.
[root@master-01 ansible]# cat /root/.k9s/config.yml
k9s:
  refreshRate: 2
  logBufferSize: 1000
  logRequestSize: 200
  currentContext: context1  # 表示当前的kube上下文。默认为当前上下文
  currentCluster: cluster1  # 表示当前的kube集群。默认为当前上下文集群
  clusters:
    cluster1:
      namespace:
        active: all
        favorites:
        - all
        - kube-system
        - default
      view:
        active: po
[root@master-01 ansible]# kubectl config view  #查看集群的配置
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.32.222:8443
  name: cluster1
contexts:
- context:
    cluster: cluster1
    user: user1
  name: context1
current-context: context1
kind: Config
preferences: {}
users:
- name: user1
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
[root@master-01 ansible]#
文章转载自云时代IT运维,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论