接着上篇k8s ansible role快速部署一个小型集群后,开发基友又催我如何快速加节点,我只想对他说:麻辣烫得升级成海底捞!
方案一:打通ansible到新增节点的免秘钥,然后将这些新增节点跑下os-init,k8s-node两个role任务就OK了
例如:
vim /etc/ansible/hosts
[newnode]
172.31.33.134
172.31.33.135
cat new-node.yaml
- name: install k8s-node
hosts: newnode
roles:
- os-init
- k8s-node
ansible-playbook new-node.yaml
即可完成拓展
方案二:packer + 镜像 + terraform
镜像制作:建议直接在运行实例中克隆一份镜像,然后用packer进行处理
比如用node-1节点制作镜像,需要执行以下操作
chmod +x /etc/rc.d/rc.local
vim /etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
echo never >> /sys/kernel/mm/transparent_hugepage/enabled
echo never >> /sys/kernel/mm/transparent_hugepage/defrag
#清理依赖相关配置项
rm -f /etc/kubernetes/cert/kubelet-bootstrap.kubeconfig
rm -f /data/k8s/kubelet && mkdir -p /data/k8s/kubelet/log
rm -f /etc/kubernetes/cert/kubelet-client*
rm -f /etc/kubernetes/cert/kubelet-server*
rm -rf /etc/cni/net.d/*
sed -i "s#.*hostnameOverride:.*#hostnameOverride: $(ip addr |grep inet |grep -v inet6 |grep eth0|awk '{print $2}' |awk -F '/' '{print $1}')#g" /etc/kubernetes/cert/kube-proxy-config.yaml
sed -i "s#bindAddress:.*#bindAddress: $(ip addr |grep inet |grep -v inet6 |grep eth0|awk '{print $2}' |awk -F '/' '{print $1}')#g" /etc/kubernetes/cert/kube-proxy-config.yaml
sed -i "s#healthzBindAddress:.*#healthzBindAddress: $(ip addr |grep inet |grep -v inet6 |grep eth0|awk '{print $2}' |awk -F '/' '{print $1}'):10256#g" /etc/kubernetes/cert/kube-proxy-config.yaml
sed -i "s#metricsBindAddress:.*#metricsBindAddress: $(ip addr |grep inet |grep -v inet6 |grep eth0|awk '{print $2}' |awk -F '/' '{print $1}'):10249#g" /etc/kubernetes/cert/kube-proxy-config.yaml
sed -i "s#.*hostname.*# --hostname-override=$(ip addr |grep inet |grep -v inet6 |grep eth0|awk '{print $2}' |awk -F '/' '{print $1}') \\\#g" /etc/systemd/system/kubelet.service
sed -i "s#address:.*#address: \"$(ip addr |grep inet |grep -v inet6 |grep eth0|awk '{print $2}' |awk -F '/' '{print $1}')\"#g" /etc/kubernetes/cert/kubelet-config.yaml
sed -i "s#healthzBindAddress:.*#healthzBindAddress: \"$(ip addr |grep inet |grep -v inet6 |grep eth0|awk '{print $2}' |awk -F '/' '{print $1}')\"#g" /etc/kubernetes/cert/kubelet-config.yaml
#token 一天过期,要重新生成token
hh=$(hostname)
#echo $hh
BOOTSTRAP_TOKEN=$(kubeadm token create --description kubelet-bootstrap-token --groups system:bootstrappers:${hh} --kubeconfig /root/.kube/config)
#echo $BOOTSTRAP_TOKEN
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/cert/ca.pem \
--embed-certs=true \
--server=https://172.31.33.118:6443 \
--kubeconfig=/etc/kubernetes/cert/kubelet-bootstrap.kubeconfig
kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=/etc/kubernetes/cert/kubelet-bootstrap.kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=/etc/kubernetes/cert/kubelet-bootstrap.kubeconfig
kubectl config use-context default --kubeconfig=/etc/kubernetes/cert/kubelet-bootstrap.kubeconfig
systemctl daemon-reload && systemctl restart kubelet kube-proxy
kubectl get csr | grep Pending | awk '{print $1}' | xargs kubectl certificate approve
我这里是阿里云,克隆完后,查询镜像ID,后续要用
最后用terraform采用这个镜像来批量创建服务器,服务器运行后能自动加入集群,这样镜像制作完成后,只需要改下terraform
创建服务器的数量配置,即可快速的实现横向伸缩node集群。terraform 配置如下
vim ecs.tf
resource "alicloud_instance" "instances" {
#创建ecs数量
count = 2
# cn-beijing
availability_zone = "cn-qingdao-c"
security_groups = "${data.alicloud_instances.instances_ds.instances.0.security_groups}"
# series III
instance_type = "${data.alicloud_instances.instances_ds.instances.1.instance_type}"
system_disk_category = "cloud_efficiency"
#克隆镜像的ID
image_id = "m-m5e8h7yfel36tbjhcnox"
host_name = "node-20"
vswitch_id = "${data.alicloud_instances.instances_ds.instances.0.vswitch_id}"
internet_max_bandwidth_out = 0
# internet_charge_type = "PayByBandwidth"
}
terraform apply 运行结果如下:
查询节点