ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux学习36-k8s集群升级及kube-vip高可用

Linux学习36-k8s集群升级及kube-vip高可用 官网升级 kubeadm 集群 | Kubernetes版本偏差策略版本偏差策略 | Kubernetes修改各节点的k8s安装源主节点和工作节点都需要修改升级k8smaster节点升级kubeadm提前下载k8s升级镜像并上传至harbor私有仓库可以新建一个images文件将需要的镜像名输入使用以下命令进行逐个拉取while read img; do docker pull $img; done images.txt再将文本中的标签改为私有仓库sed -i s#registry.aliyuncs.com/google_containers#reg.westos.org/k8s#g images.txt批量打上标签while read westos_img; do ali_img$(echo $westos_img | sed s#reg.westos.org/k8s#registry.aliyuncs.com/google_containers#) docker tag $ali_img $westos_img done images.txt批量推送加入空行判断while read img; do if [ -n $img ];then docker push $img fi done images.txt修改containerd配置验证升级计划执行升级命令等待升级完成成功如有需要手动升级CNI 驱动插件如果有多个master节点可以执行以下命令升级#kubeadm upgrade node不需要执行 kubeadm upgrade plan 和更新 CNI 驱动插件的操作腾空节点升级 kubelet 和 kubectl重启kubelet解除节点的保护验证集群状态主节点已升级成功升级工作节点最好逐个升级如果需要同时升级则保证有合适的node可以接纳被驱逐的pod修改containerd配置升级kubeadm执行升级命令腾空节点需要在k8s-master节点执行如果出现无法删除的pod可以修改最大容忍取决于副本数和最小可用升级 kubelet 和 kubectl重启kubelet解除节点的保护需要在k8s-master节点执行其它工作节点以此类推最后验证集群状态成功k8s高可用集群每个控制平面节点运行kube-apiserver、kube-scheduler和kube-controller-manager实例。kube-apiserver使用负载均衡器暴露给工作节点。每个控制平面节点创建一个本地 etcd 成员member这个 etcd 成员只与该节点的kube-apiserver通信。 这同样适用于本地kube-controller-manager和kube-scheduler实例。这种拓扑将控制平面和 etcd 成员耦合在同一节点上。相对使用外部 etcd 集群 设置起来更简单而且更易于副本管理。HA 集群运行至少三个堆叠的控制平面节点。etcd 分布式数据存储集群在独立于控制平面节点的其他节点上运行。就像堆叠的 etcd 拓扑一样外部 etcd 拓扑中的每个控制平面节点都会运行kube-apiserver、kube-scheduler和kube-controller-manager实例。 同样kube-apiserver使用负载均衡器暴露给工作节点。但是 etcd 成员在不同的主机上运行 每个 etcd 主机与每个控制平面节点的kube-apiserver通信。这种拓扑结构解耦了控制平面和 etcd 成员。因此它提供了一种 HA 设置 其中失去控制平面实例或者 etcd 成员的影响较小并且不会像堆叠的 HA 拓扑那样影响集群冗余。但此拓扑需要两倍于堆叠 HA 拓扑的主机数量。 具有此拓扑的 HA 集群至少需要三个用于控制平面节点的主机和三个用于 etcd 节点的主机。集群环境初始化实验环境之前的所有节点reset重启如果想要恢复可以参照之前的k8s的备份与恢复所有k8s集群节点执行以下步骤由于我们使用的是rocky9系统所以无需升级内核haproxy负载均衡可以直接将编辑好的文件复制到其他节点启动服务检查端口keepalived高可用安装软件配置keepalived注意网卡根据实际修改haproxy检测脚本#!/bin/bashif ! ps aux | grep -q [h]aproxy; thensystemctl start haproxysleep 2if ! ps aux | grep -q [h]aproxy; thensystemctl stop keepalivedfifi添加执行权限启动服务其它master节点的keepalived配置只需要以下两个参数其它保持一致k8s-master02stateBACKUPpriority90k8s-master03stateBACKUPpriority80kubeadm部署集群配置集群初始化文件apiVersion: kubeadm.k8s.io/v1beta4bootstrapTokens:- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authenticationkind: InitConfigurationlocalAPIEndpoint:advertiseAddress: 192.168.154.206 #本机IPbindPort: 6443nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sockimagePullPolicy: IfNotPresentimagePullSerial: truename: k8s1 #本机主机名taints: nulltimeouts:controlPlaneComponentHealthCheck: 4m0sdiscovery: 5m0setcdAPICall: 2m0skubeletHealthCheck: 4m0skubernetesAPICall: 1m0stlsBootstrap: 5m0supgradeManifests: 5m0s---apiServer:certSANs: #添加VIP到证书- 192.168.154.230apiVersion: kubeadm.k8s.io/v1beta4caCertificateValidityPeriod: 876000h0m0scertificateValidityPeriod: 87600h0m0scertificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrolPlaneEndpoint: 192.168.154.230:8443 #负载均衡地址端口controllerManager: {}dns: {}encryptionAlgorithm: RSA-2048etcd:local:dataDir: /var/lib/etcdimageRepository: reg.westos.org/k8s #harbor私有仓库kind: ClusterConfigurationkubernetesVersion: 1.36.5 #k8s部署版本networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12 #service网段podSubnet: 10.244.0.0/16 #Pod网段proxy: {}scheduler: {}---apiVersion: kubeproxy.config.k8s.io/v1alpha1kind: KubeProxyConfigurationmode: ipvs #kube-proxy使用IPVS模式ipvs:scheduler: rr #调度算法strictARP: true #高可用场景必须开启避免 ARP 冲初始化集群其他两个节点不需要初始化设置环境变量写入环境变量文件确保重启后依然生效设置kubectl命令补齐yum install -y bash-completionecho source (kubectl completion bash) ~/.bashrcsource ~/.bashrc查看集群状态如有报错可以重置节点kubeadm reset -f --ignore-preflight-errorsall安装calico网络插件下载部署文件wgethttps://raw.githubusercontent.com/projectcalico/calico/v3.31.0/manifests/calico.yaml修改镜像位置指向harbor仓库部署网络插件查看集群状态扩容master节点在执行命令之前确保已完成初始化等必要操作certificate-key和token获取注意虚拟ip查看集群状态扩容worker节点worker节点的初始化详情可见之前的扩容教程加入之前确保初始化完成查看集群状态节点添加标签查看etcd集群主从关系# Step 1获取当前 Master 节点主机名称host$(hostname)# Step 2获取 etcd 节点 pod 名称etcd$(kubectl get pod -n kube-system | grep Running | grep etcd | head -n 1 | awk {print $1})# Step 3获取 etcd 目录cert_dir/etc/kubernetes/pki/etcd# 以上信息也可以从 /etc/kubernetes/manifests/etcd.yaml 中获取# Step 4 查询 etcd 集群成员信息kubectl -n kube-system exec ${etcd} -- \sh -c ETCDCTL_API3 etcdctl --endpointshttps://127.0.0.1:2379 --cert${cert_dir}/server.crt --key${cert_dir}/server.key --cacert${cert_dir}/ca.crt member list -w table# Step 5 仅查询当前节点kubectl -n kube-system exec ${etcd} -- \sh -c ETCDCTL_API3 etcdctl --endpointshttps://127.0.0.1:2379 --cert${cert_dir}/server.crt --key${cert_dir}/server.key --cacert${cert_dir}/ca.crt endpoint status -w table# Step 6查询所有节点kubectl -n kube-system exec ${etcd} -- \sh -c ETCDCTL_API3 etcdctl --endpointshttps://127.0.0.1:2379 --cert${cert_dir}/server.crt --key${cert_dir}/server.key --cacert${cert_dir}/ca.crt endpoint status --cluster -w table# Step 7查询所有 keykubectl -n kube-system exec ${etcd} -- sh -c ETCDCTL_API3 etcdctl --endpointshttps://127.0.0.1:2379 --cert${cert_dir}/server.crt --key${cert_dir}/server.key --cacert${cert_dir}/ca.crt get / --prefix --keys-only | grep -v ^$# Step 8查询某个 key 对应的 valuekubectl -n kube-system exec ${etcd} -- \sh -c ETCDCTL_API3 etcdctl --endpointshttps://127.0.0.1:2379 --cert${cert_dir}/server.crt --key${cert_dir}/server.key --cacert${cert_dir}/ca.crt get /registry/services/specs/kube-system/kube-dnskube-vip云原生高可用官网Static Pods | kube-vip将刚才的集群初始化停止haproxy和keepalived服务,最后重启清除多余的ip上传镜像至harbor仓库从镜像中拷贝二进制文件拷贝到所有master节点在所有master节点上部署kube-vip第一个master节点初始化时需要修改下授权文件需要在以下文件中将8443端口改为6443部署文件放在静态pod的路径kubelet会自动拉起podapiVersion: v1kind: Podmetadata:name: kube-vipnamespace: kube-systemspec:containers:- args:- managerenv:- name: vip_arpvalue: true- name: portvalue: 6443- name: vip_nodenamevalueFrom:fieldRef:fieldPath: spec.nodeName- name: vip_interfacevalue: ens33- name: vip_subnetvalue: 32- name: dns_modevalue: first- name: cp_enablevalue: true- name: cp_namespacevalue: kube-system- name: svc_enablevalue: true- name: svc_leasenamevalue: plndr-svcs-lock- name: vip_leaderelectionvalue: true- name: vip_leasenamevalue: plndr-cp-lock- name: vip_leasedurationvalue: 5- name: vip_renewdeadlinevalue: 3- name: vip_retryperiodvalue: 1- name: addressvalue: 192.168.154.230- name: prometheus_servervalue: :2112image: reg.westos.org/kube-vip/kube-vip:v1.2.4imagePullPolicy: IfNotPresentname: kube-vipresources: {}securityContext:capabilities:add:- NET_ADMIN- NET_RAWdrop:- ALLvolumeMounts:- mountPath: /etc/kubernetes/admin.confname: kubeconfighostAliases:- hostnames:- kubernetesip: 127.0.0.1hostNetwork: truevolumes:- hostPath:path: /etc/kubernetes/super-admin.confname: kubeconfigstatus: {}正常初始化集群可以看到kube-vip 已启动查看vip其它master节点直接使用命令创建即可使用命令创建部署文件kubeadm init --configkubeadm-config.yml --upload-certs测试目前vip在k8s1上将k8s1关机后vip漂移到了k8s2上
返回列表