写在开篇
kubeadm工具快速部署k8s集群实现故障自动发现、转移及修复,集群中部署prometheus+grafan可实现自动收集集群的各项新性能指标数据,可视化界面提升客户对各项性能指标的直观感知,实现高效快速故障排查及解决。
一、kubeadm搭建k8s集群
1、Kubeadm简介:
(1)什么是kebeadm?
作为Kubernetes官方提供的集群部署管理工具,采用“一键式”指令进行集群的快速初始化和安装,极大地简化了部署过程,消除了集群安装的痛点。可以快速部署一套k8s集群。
(2)Kubeadm基本原理:
在启动的过程可以查看到拉取组件镜像的过程。之所以kubeadm能成为最快搭建k8s集群的工具就在于它将组件都容器化部署。使用两条命令可以快捷部署一套k8s集群:kubeadm init:初始化集群并启动master相关组件,在计划用做master的节点上执行。kubeadm join:将节点加入上述集群,在计划用做node的节点上执行。
(3)K8s集群角色中包含的组件:
K8s-master: kube-apiserver controller-manager Scheduler Etcd K8s-node: Kubelet Kube-proxy Docker
1.1 项目实验环境要求
可根据实际生产环境的需求配备适配的基础环境,本次项目仅作为实验参考
集群角色 | 机器数量 | 操作系统 | 硬件配置 | iP地址 | 网络策略 | 备注 |
K8s-master | 1台 | CentOS7.x-86_x64 | 2个cpu2GB内存40GB硬盘 | 192.168.1.15 | 配置弹性公网;集群间网络可互访 | 禁止swap分区 |
K8s-node1 | 1台 | CentOS7.x-86_x64 | 2个cpu2GB内存40GB硬盘 | 192.168.1.16 | 配置弹性公网;集群间网络可互访 | 禁止swap分区 |
K8s-node2 | 1台 | CentOS7.x-86_x64 | 2个cpu2GB内存40GB硬盘 | 192.168.1.17 | 配置弹性公网;集群间网络可互访 | 禁止swap分区 |
1.2 实操步骤
1.2.1 环境准备
###三台机器均执行以下操作 ###关闭防火墙: systemctl stop firewalld systemctl disable firewalld ###关闭selinux: sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 setenforce 0 # 临时操作 ###关闭swap: swapoff -a # 临时操作 vim /etc/fstab # 永久操作 ###关闭swap: swapoff -a # 临时 vim /etc/fstab # 永久 ###设置主机名: hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node2 ###将桥接的ipv4流量传递到iptables的链: cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system ###时间同步:假设时间不同步可以使用date set保证节点时间同步
1.2.2 安装docker
官网建议安装docker-19.03.9版本适配k8s集群
内网建议使用二进制安装,外网可以使用ali源或清华源进行安装
###三台机器均执行以下操作 ###使用ali源下载并安装 Wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce systemctl enable docker && systemctl start docker ###使用二进制包安装 外网机器下载二进制包(下载完毕可使用文件传输工具将包传送到内网机器上): Wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz ###内网机器安装部署docker: tar zxvf docker-19.03.9.tgz mv docker/* /usr/bin ###配置system管理docker: cat > /usr/lib/systemd/system/docker.service << EOF [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target EOF ###配置docker加速器: mkdir /etc/docker cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF ###后台加载daemon.json systemctl daemon-reload ###启动docker systemctl start docker
1.2.3 安装kubeadm
获取yum软件源安装kubeadm
本人使用华为云自带的yum软件源安装部署,仅作为实验参考
###外网环境安装kubeadm: 添加ali yum软件源 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 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 systemctl enable kubelet ###内网环境安装kubeadm: 1、可以使用外网机器下载网络yum源并制作成本地源打包上传到内网机器上安装。 2、外网机器部署kubeadm获取到组件的镜像。Docker save将其保存为本地镜像供给内网使用(这里不详细解读操作,可以百度获取相关信息) 安装部署k8s-master: ###yum软件包完成kubeadm安装后通过命令行传参的方式初始化master。(当然也可以通过配置文件kubeadm.conf的方式进行初始化(即将命令行的参数写在配置文件中,通过配置文件引导初始化集群,本实验为了方便选择命令传参进行初始化) kubeadm init \ --apiserver-advertise-address=192.168.1.15 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.18.0 \ 指定版本 --service-cidr=10.96.0.0/12 \ #cidr网段指的是插件的网段.配置的网段和集群内的物理网段不可以起冲突 --pod-network-cidr=10.244.0.0/16 \ #pod分配的网段,配置的网段和集群内的物理网段不可以起冲突 --ignore-preflight-errors=all #指的是忽略错误信息 ###在集群初始化的过程中,底层都历经哪些步骤呢? 1、[preflight]环境检查 #前期环境的部署情况 2、[kubelet-start]生成配置文件并启动 配置文件所在路径/var/lib/kubelet/config.yml 3、[cert]有apiserver,etcd,proxy证书 4、[kubeconfig]这个格式都用于K8S的认证文件 是组件之间的相互链接的关键 5、[control-plan] 静态创建pod静态pod目录 /etc/kubenetes/mainfests 用于拉取pod 6、[etcd]etcd静态pod启动etcd 实现kubelet开机自启: Systemctl enable kubelet ###Master初始化的过程中会提示在其他节点执行自主添加进集群的命令 在node节点上输入以下命令可自主添加进k8s集群 kubeadm join 192.168.1.15:6443 --token 0exccz.8q01ow3wqgmw5d6o \ --discovery-token-ca-cert-hash sha256:83003fe9ea8097c62610b35904f2ea1b23832bbd7f98e2a3fbe4c03ee912ed2d ###token是有效期的,关闭终端找不到此提示命令,可以通过一条命令再次生成。 kubeadm token create --print-join-command ###加上--ttl ,可以设置永久不过期。 ###查看token的有效时间 kubeadm token list
1.2.4 部署容器网络cni
Calico是一个纯三层的数据中心网络方案,calico支持广泛的平台,包括kubernets,openstack等等。
Calico在每个计算节点利用linux kernel实现一个高效的虚拟路由器来负责数据转发,而每个vrouter通过bgp协议负责把自己上运行的workload的路由信息向整个calico网络内传播
###外网环境: wget https://docs.projectcalico.org/manifests/calico.yaml vim calico.yaml /192 去注释 - name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16" /169 去注释 kubectl apply -f calico.yaml Kubectl get pods -n kube-system -w 动态查看pod状态 ###内网环境: 1、可以使用外网机器下载网络yum源并制作成本地源打包上传到内网机器上安装。 2、外网机器部署calico获取到组件的镜像。Docker save将其保存为本地镜像供给内网使用(这里不详细解读操作,可以百度获取相关信息)
1.2.5 部署dashboar
是默认k8s UI界面,主要用于查看集群资源
###下载并编辑dashboar的文本文档 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml vim recommended.yaml kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: ports: - port: 443 nodePort: 30001(添加的) targetPort: 8443 selector: k8s-app: kubernetes-dashboard type: NodePort(添加的) ###创建pod kubectl apply -f recommended.yaml ###查看pod状态信息 kubectl get pods -n kubernetes-dashboard ###登录UI界面: 火狐浏览器登录https://公网ip:30001,选择tonken验证 我们可以创建一个用户拿到token值 ###创建用户 创建service account并绑定默认cluster-admin管理员集群角色: kubectl create serviceaccount dashboard-admin -n kube-system ###用户授权 kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin ###将token粘贴在网页验证的位置 ###获取用户Token kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
1.2.6 Keepalived搭建Master高可用
Nginx是一个主流Web服务和反向代理服务器,这里用四层实现对apiserver实现负载均衡
Keepalived基于VIP绑定实现服务器双机热备
Keepalived主要根据Nginx运行状态判断是否需要故障转移(偏移VIP),例如当Nginx主节点挂掉,VIP会自动绑定在Nginx备节点,从而保证VIP一直可用,实现Nginx高可用。
###主/备安装软件包 yum install epel-release -y yum install nginx keepalived -y 主/备nginx配置文件 cat > /etc/nginx/nginx.conf << "EOF" user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } #四层负载均衡,为两台Master apiserver组件提供负载均衡 stream { log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent'; access_log /var/log/nginx/k8s-access.log main; upstream k8s-apiserver { server 192.168.31.71:6443; # Master1 APISERVER IP:PORT server 192.168.31.74:6443; # Master2 APISERVER IP:PORT } server { listen 6443; proxy_pass k8s-apiserver; } } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 80 default_server; server_name _;3. keepalived配置文件(Nginx Master) vrrp_script:指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移) virtual_ipaddress:虚拟IP( VIP) 检查nginx状态脚本: location / { } } } EOF 主Keepalived配置文件 cat > /etc/keepalived/keepalived.conf << EOF global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id NGINX_MASTER } vrrp_script check_nginx { #指定检查nginx工作状态脚本(根据nginx状态判断是否故障转移 script "/etc/keepalived/check_nginx.sh" } vrrp_instance VI_1 { state MASTER interface ens33 # 修改为实际网卡名 virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的 priority 100 # 优先级,备服务器设置 90 advert_int 1 # 指定VRRP 心跳包通告间隔时间,默认1秒 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP virtual_ipaddress { #虚拟IP(VIP) 192.168.31.88/24 } track_script { # check_nginx } } EOF Nginx健康检查脚本 cat > /etc/keepalived/check_nginx.sh << "EOF" #!/bin/bash count=$(ps -ef |grep nginx |egrep -cv "grep|$$") if [ "$count" -eq 0 ];then exit 1 else exit 0 fi EOF chmod +x /etc/keepalived/check_nginx.sh 备Keepalived配置文件 cat > /etc/keepalived/keepalived.conf << EOF global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id NGINX_BACKUP } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.31.88/24 } track_script { check_nginx } } EOF ### 备nginx健康检查脚本如主所示,不重复解释
二、k8s搭建Prometheus
1.promethues简介
(1)什么是prometheus?
是一套开源监控、报警、时间序列、数据库的组合采集的样本,以时间序列的方式存在内存(TSDB时序数据库,不属于非关系型或关系型数据库)中,并定时持久化存储在硬盘中。
(2)Prometheus适用场景和不适用场景
天生适用于k8s,promethus可以很好记录任何纯数据自时间序列,适用于以机器为中心的监视,也适用于高度动态的面向服务的体系结构的监视。
适用于为微服务架构,优势在于每个 prometheus server是独立的,不依赖与任何介质,当它挂掉的时候自己会书写一份日志。用户可以通过日志排除故障并重启prometheus。
不适合用于一些精准性需求很高的场合