32-k8s项目实战-01-集群节点扩缩容

一,项目描述

        生产环境中,对于k8s已有环境进行扩容和缩容是比较常见的操作,比如现有k8s集群资源不足,就需要扩容节点,就是将物理机配置加入k8s集群node;

        或者说当前k8s集群工作不饱和,有大量空闲的机器资源,闲置浪费严重,所以需要缩容,就是将物理机配置退出k8s集群node;

二、集群缩容-节点下线

        我们从总体架构中(第一天就让大家背下来了,不知道的回去背下来)知道,k8s集群监控一个节点的cpu、内存、磁盘空间、文件系统inode等资源是依靠kubelet组件;

        当这些资源中的一个或者多个达到特定的消耗水平(消耗到一定程度了),kubelet就会主动将节点上的一个或者多个pod强制进行“驱逐”,以防止当前node节点资源无法正常分配,而引发内存溢出(OOM);

1,节点下线案例说明

        我们需要先把要下线的node节点中的pod驱逐,模拟下线节点(node节点可能因为硬件故障或者其他原因,有下线的需求)

2,查看现有节点

[root@k8s231 ~]# kubectl get nodes
NAME     STATUS   ROLES                    AGE   VERSION
k8s231   Ready    control-plane,master   57d   v1.23.17
k8s232   Ready    <none>                        57d   v1.23.17
k8s233   Ready    <none>                        57d   v1.23.17

3,查看所有名称空间下的pod

        假设,我们要下下k8s233节点,我们发现,k8s233节点上是有pod的,

[root@k8s231 ~]# kubectl get pods -o wide -A

4,驱逐下线节点的pod

        驱逐一个节点的所有pod;但是需要排除daemonset资源创建的pod,因为,dadmonset资源是根据节点数量来创建pod的,若不排除,则会驱逐不了;

[root@k8s231 ~]# kubectl drain k8s233 --ignore-daemonsets

参数介绍

--ignore-daemonsets #daemonset资源不能被驱逐,需要排除,加这个选项参数排除;
--delete-emptydir-data #如果无法驱逐成功,再加这个参数;

5,驱逐后再次查看pod

        驱逐pod后,我们会发现,k8s233还存在两个pod;

        一个是flannel组件还有一个是kube-proxy代理pod;

        我们不用管这两个没有被驱逐的pod;

[root@k8s231 ~]# kubectl get pods -o wide -A | grep k8s233

6,驱逐pod后再次查看节点信息

[root@k8s231 ~]# kubectl get nodes

        再次查看被下线的节点,发现,其状态有一个“不可调度”;

7,给要下线的节点打上污点

        因为要将节点下线,避免在下线过程中,有人往这个节点中创建资源,所以保守起见,给它设置个污点;

[root@k8s231 ~]# kubectl taint node k8s233 k8s=xinjizhiwa:NoExecute

8,再次查看要下线节点的pod

        会发现,仅剩下kube-proxy了;

        这个时候,你就可以将节点直接下线了;

[root@k8s231 ~]# kubectl get pods -o wide -A | grep k8s233

9,下线节点重置

        需要到要下线的节点中执行“重置”命令,重置下线节点

[root@k8s233 ~]# kubeadm reset -f

        删除要下线节点的cni网络目录

[root@k8s233 ~]# rm -rf /etc/cni/net.d 

#清空路由规则

[root@k8s233 ~]# iptables -F

#查看打印规则
[root@k8s233 ~]# iptables-save

10,删除掉节点

        注意,master节点执行

[root@k8s231 ~]# kubectl delete nodes k8s233

查看验证,发现下线成功!~

[root@k8s231 ~]# kubectl get nodes
NAME     STATUS   ROLES                    AGE   VERSION
k8s231   Ready    control-plane,master   57d   v1.23.17
k8s232   Ready    <none>                        57d   v1.23.17

温馨提示:

        1,当我们直接下线一个节点的时候,该节点的pod将不会立刻被检测出来故障,大概5分钟左右才能将损坏的pod在其他节点中创建,但是再次之前,会优先发现该的状态为“Notready”;

        2,综上所述,我们生产环境中应该监控nodes的状态,当然,pods重启次数也需要关注哦;所以说,要报账pod业务正常运行,必须监控nodes的状态;

三、集群扩群-节点上线

 1,给上线节点安装必要组件

#配置软件源
[root@k8s233 ~]# cat  > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF

#2,下载组件
[root@k8s233 ~]# yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0

#3,启动组件(这里会启动失败,但是不要紧,一会自动成功)
[root@k8s233 ~]# systemctl enable --now kubelet
[root@k8s233 ~]# systemctl status kubelet

2,master节点创建token

[root@k8s231 ~]# kubeadm token create --print-join-command abc123.abcdabcd11122233 --ttl 0

参数说明

--print-join-command   #打进加入token的命令

--ttl 0   #token的过期时间,0代表无限期;

#################################

#token的名称规则:

[a-z0-9]{6})\\.([a-z0-9]{16}

3,查看刚刚创建的token

[root@k8s231 ~]# kubeadm token list

拓展知识删除token:【kubeadm  token  delete  abc123】

4,新节点使用token加入集群

        就是创建token时,打印的代码,复制(注意,别复制空格,不然加入失败);

[root@k8s233 ~]# kubeadm join 10.0.0.231:6443 --token abc123.abcdabcd11122233 --discovery-token-ca-cert-hash sha256:1f92ee9dc95199d6d7af9b56218b18a3a6e184f3037e2f2b244bfbb6709d19cb

5,验证是否成功

[root@k8s231 ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE   VERSION
k8s231   Ready    control-plane,master   57d   v1.23.17
k8s232   Ready    <none>                 57d   v1.23.17
k8s233   Ready    <none>                 80s   v1.23.17

至此,节点上线,就成功了;

四、拓展:bootstrap详解(了解即可)

        我们刚刚,在节点上线时,创建了一个token,我们查询k8s系统中的secret资源,会发现有一个叫bootstrap-token-abc123的名称;

1,查看secret资源

我们发现,这个secret资源的名称,与我们创建token名称相同;

[root@k8s231 ~]# kubectl get secrets -A | grep abc123

2,base64解码secret资源信息

· yaml格式查看这个secret的信息

[root@k8s231 ~]# kubectl get -n kube-system  secret bootstrap-token-abc123 -o yaml
..............
  token-id: YWJjMTIz
  token-secret: YWJjZGFiY2QxMTEyMjIzMw==
...............

· 反向解码base64

[root@k8s231 ~]# echo YWJjMTIz | base64 -d
abc123

[root@k8s231 ~]# echo YWJjZGFiY2QxMTEyMjIzMw== | base64 -d
abcdabcd11122233

我们可以看见,解码之后,就是我们床架你的token名称;

3,小结

        也就是说,我们创建系统token,同时也在系统中,创建了secret资源;

4,查看新加入节点的证书

        可以看到,新节点的证书创建时间,正是新节点使用token接入集群后,才创建的;

[root@k8s233 ~]# ll /etc/kubernetes/pki/
total 4
-rw-r--r-- 1 root root 1099 Feb 28 01:50 ca.crt

5,总结

        前期,新节点没有证书,借助token联系apiserver加入集群

        加入后,apiserver为新节点生成证书,用于以后交互使用;

第一个项目,就此结束;

  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用 Ansible 的 time 模块来计算集群节点之间的时间差。 首先,在 Ansible 控制节点上创建一个 playbook 文件,比如叫做 `time_diff.yml`,内容如下: ```yaml - hosts: k8s_nodes gather_facts: false tasks: - name: Get current time set_fact: current_time: "{{ ansible_date_time.epoch }}" - name: Get remote time shell: date +%s register: remote_time - name: Calculate time difference set_fact: time_diff: "{{ current_time - remote_time.stdout|int }}" - name: Print time difference debug: msg: "Time difference with {{ inventory_hostname }} is {{ time_diff }} seconds." ``` 在这个 playbook 中,我们首先使用 `set_fact` 模块获取当前时间,并将其保存在 `current_time` 变量中。然后,使用 `shell` 模块在远程节点上执行 `date +%s` 命令,获取远程节点的当前时间,并将其保存在 `remote_time` 变量中。接着,使用 `set_fact` 模块计算时间差,并将其保存在 `time_diff` 变量中。最后,使用 `debug` 模块打印时间差。 注意,这个 playbook 需要在 k8s_nodes 组内的所有节点上执行,因此需要在 inventory 文件中定义这个组,比如: ``` [k8s_nodes] node1 ansible_host=192.168.1.101 node2 ansible_host=192.168.1.102 node3 ansible_host=192.168.1.103 ``` 然后执行 playbook: ```bash ansible-playbook -i inventory.txt time_diff.yml ``` 执行完后,你应该可以看到类似于这样的输出: ``` ok: [node1] => { "msg": "Time difference with node1 is 0 seconds." } ok: [node2] => { "msg": "Time difference with node2 is 2 seconds." } ok: [node3] => { "msg": "Time difference with node3 is -1 seconds." } ``` 这表示在 node1 上执行 playbook 时,node1 的时间与当前时间相同,因此时间差为 0。在 node2 上执行 playbook 时,node2 的时间比当前时间慢了 2 秒,因此时间差为 2。在 node3 上执行 playbook 时,node3 的时间比当前时间快了 1 秒,因此时间差为 -1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心机の之蛙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值