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计算节点非常简单,大体的过程如下:
需要配置此机器可以通过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-streamtar 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]#






