1. 设置共享目录 前提:必须关闭虚拟机,再点击设置
如图所示:
2. 使用共享目录 # 安装 open-vm-tools yum install -y open-vm-tools # 共享目录生效 vmhgfs-fuse /mnt/hgfs/ # 设置软链 mkdir /opt/vm-share ln -s /mnt/hgfs/vm-share/ /opt/vm-share 3. 设置开机启动 cat >> /etc/rc.local <<EOF vmhgfs-fuse /mnt/hgfs/ EOF1. 目录 1. 目录 2. 什么是 Kubernetes 的高可用 3. Haproxy + Keepalived 优缺点 3.1. Haproxy 3.2. Keepalived 4. 架构图 5. Haproxy 5.1. 底层原理 5.2. VRRP 底层原理 5.4. 安装(二进制方式) 6. KeepAlived 6.1. 底层原理 6.3. 安装 7. 参考 8. 关于作者 2. 什么是 Kubernetes 的高可用 高可用性是指系统或应用程序在面对故障或异常情况时能够保持持续运行和提供服务的能力。在构建高可用的Kubernetes集群时,可以采取以下一些高级方法和策略:
多节点部署:使用多个节点来部署Kubernetes集群,确保即使某个节点发生故障,其他节点仍然可以继续提供服务。
负载均衡:通过在集群前端引入负载均衡器,将流量分发到多个节点上,实现负载均衡和故障转移。这样即使某个节点发生故障,负载均衡器可以将流量重新路由到其他健康的节点上。
自动伸缩:利用Kubernetes的自动伸缩功能,根据实际负载情况自动调整集群的节点数量,以满足应用程序的需求。这样可以在高负载时增加节点数量,保证性能,而在低负载时减少节点数量,节省资源。
容器健康检查:通过定义容器的健康检查机制,Kubernetes可以监控容器的运行状态,并在容器出现故障或异常时自动重启或替换容器,确保应用程序的持续可用性。
数据备份和恢复:定期对关键数据进行备份,并建立可靠的数据恢复机制,以防止数据丢失或损坏。这可以通过使用Kubernetes的持久化存储卷(Persistent Volume)和备份工具来实现。
故障切换和容错:通过使用Kubernetes的故障切换功能,可以在节点或容器发生故障时自动将服务切换到备用节点或容器上,确保应用程序的连续性和可用性。
监控和告警:建立全面的监控系统,实时监测集群和应用程序的运行状态,并设置告警机制,及时发现和处理潜在的故障或异常情况。
通过采取这些高级方法和策略,可以有效地提高Kubernetes集群的可用性和稳定性,确保应用程序在运行时不会出现服务中断。
3. Haproxy + Keepalived 优缺点 Haproxy和Keepalived是常用的组合,用于实现负载均衡和高可用性的解决方案。下面是它们的优缺点:
3.1. Haproxy Haproxy的优点:
高性能:Haproxy是一个高性能的负载均衡器,能够处理大量的并发连接和请求。 灵活的配置:Haproxy提供了丰富的配置选项,可以根据需求进行灵活的负载均衡策略和规则配置。 健康检查:Haproxy支持对后端服务器进行健康检查,可以自动排除故障的服务器,确保只将请求转发到健康的服务器上。 SSL终止:Haproxy可以作为SSL终止器,将SSL/TLS连接解密后再转发给后端服务器,减轻服务器的负担。 Haproxy 的缺点:
单点故障:Haproxy本身是单点,如果Haproxy节点发生故障,可能会导致服务中断。 配置复杂:Haproxy的配置相对复杂,需要一定的学习和经验来正确配置和管理。 3.2. Keepalived Keepalived 的优点:1. 介绍限流 限流是一种通过对系统请求进行限制和控制,避免系统过载,保证系统稳定性和安全性的技术手段。
2. Istio 限流 首先确认需要限流的应用是否已经加载了 sidecar,如果还未安装 istio, 请参考:https://yezihack.github.io/istio-install.html 创建 app-ratelimit.yaml:
设置流速间隔时间:token_bucket.fill_interval 设置流速令牌数量:token_bucket.max_tokens 选择哪些应用限流:workloadSelector.labels apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: app-ratelimit spec: workloadSelector: labels: app: my-app # 用来选择需要进行配置的工作负载 configPatches: - applyTo: HTTP_FILTER match: listener: filterChain: filter: name: "envoy.filters.network.http_connection_manager" patch: operation: INSERT_BEFORE value: name: envoy.filters.http.local_ratelimit typed_config: "@type": type.googleapis.com/udpa.type.v1.TypedStruct type_url: type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit value: stat_prefix: http_local_rate_limiter token_bucket: # 令牌桶算法的配置信息,用于控制每秒放行的请求数量。 max_tokens: 10 # 指定令牌桶中最多可以存储的令牌数,即最大可用令牌数 tokens_per_fill: 10 # 指定每次填充令牌桶的令牌数,即每次可用令牌数。 fill_interval: 60s # 定填充令牌桶的时间间隔,即每隔多长时间填充一次令牌桶。 filter_enabled: # 控制是否启用该过滤器的开关。 runtime_key: local_rate_limit_enabled default_value: numerator: 100 denominator: HUNDRED filter_enforced: # 制是否强制执行该过滤器的开关。 runtime_key: local_rate_limit_enforced default_value: numerator: 100 denominator: HUNDRED response_headers_to_add: - append: false header: key: x-local-rate-limit value: 'true' kubectl apply -f app-ratelimit.1. Istio 介绍 Istio 是由 Google、IBM 和 Lyft 开源的微服务管理、保护和监控框架。Istio 为希腊语,意思是”起航“。
Istio 使用功能强大的 Envoy 服务代理扩展了 Kubernetes,以建立一个可编程的、可感知的应用程序网络。
Istio 与 Kubernetes 和传统工作负载一起使用,为复杂的部署带来了标准的通用流量管理、遥测和安全性。
2. 下载 istio 以 CentOS7 为例
官方下载:https://github.com/istio/istio/releases/
截止写本文时,版本更新到 v1.18.0。
2.1. 版本的选择 https://istio.io/latest/zh/docs/releases/supported-releases/
v1.18.0 适合 k8s 1.24, 1.25, 1.26, 1.27。
根据你的 kubernetes 版本进行下载相应的 istio 版本。
cd /opt/src wget https://github.com/istio/istio/releases/download/1.18.0/istio-1.18.0-linux-amd64.tar.gz tar -zxvf istio-1.18.0-linux-amd64.tar.gz cd istio-1.18.0 cp istio-1.18.0/bin/istioctl /usr/local/bin # 查看版本 istioctl version # 如果显示如下,则表示你未设置 KUBECONFIG 环境变量 unable to retrieve Pods: Get "http://localhost:8080/api/v1/namespaces/istio-system/pods?fieldSelector=status.phase%3DRunning&labelSelector=app%3Distiod": dial tcp [::1]:8080: connect: connection refused 1.1. 准备工作 搭建 ETCD 高可用集群,至少3台或5台或7台,奇数台即可。本地搭建采用3台 Linux CentOS7.9 环境。
序列 HOSTNAME IP etcd 节点名称 1 kube-10 192.168.9.10 etcd01 2 kube-11 192.168.9.11 etcd02 3 kube-13 192.168.9.13 etcd03 创建目录:
bin 存储 etcd 二进制文件 data 存储数据目录 sh 脚本目录 ssl 证书目录 # 每个机器上都执行 mkdir -p /opt/etcd/{bin,data,sh,ssl} 2. 证书生成 2.1. cfssl 工具 cd /opt/src # 下载 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 # 改名 mv cfssl_linux-amd64 cfssl mv cfssljson_linux-amd64 cfssljson mv cfssl-certinfo_linux-amd64 cfssl-certinfo # 添加执行权限 chmod +x cfssl cfssljson cfssl-certinfo # 复制到 /usr/local/bin cp cfssl cfssl-cerinfo cfssljson /usr/local/bin 2.1. 准备工作 适合于 kubernetes 1.17/1.18/1.19/1.20/1.21 搭建 ETCD 高可用集群,至少3台或5台或7台,奇数台即可。本地搭建采用3台 Linux CentOS7.9 环境。
序列 HOSTNAME IP etcd 节点名称 1 kube-10 192.168.9.10 etcd01 2 kube-11 192.168.9.11 etcd02 3 kube-13 192.168.9.13 etcd03 创建目录:
bin 存储 etcd 二进制文件 data 存储数据目录 conf 配置目录 sh 脚本目录 ssl 证书目录 # 每个机器上都执行 mkdir -p /opt/etcd-3.4/{bin,data,sh,ssl,conf} 时间同步 # 安装 yum install chrony -y # 管理 systemctl start chronyd #启动 systemctl status chronyd #查看 systemctl restart chronyd #重启 systemctl stop chronyd #停止 systemctl enable chronyd #设置开机启动 # 修改时区 timedatectl set-timezone Asia/Shanghai # 设置完时区后,强制同步下系统时钟: chronyc -a makestep 设置与指定服务器时间同步源码安装 nginx 下载 http://nginx.org/en/download.html
wget http://nginx.org/download/nginx-1.23.3.tar.gz tar -zxvf nginx-1.23.3.tar.gz cd nginx-1.23.3 修改源码版本(可选) 增加安全性,可以修改 nginx 默认的版本名称,如 nginx/1.23.3, 可任意修改为: sgfoot/100.0.0
vim src/core/nginx.h # 大约在14行左右 #define nginx_version 1023003 #define NGINX_VERSION "1.23.3" # 版本号修改 #define NGINX_VER "nginx/" NGINX_VERSION # 软件名称修改 安装 使用自定义用户和用户组,更加安全 开启模块:
with-http_ssl_module SSL模块 with-http_stub_status_module 统计功能模块,分析 nginx 性能 with-http_realip_module 获取真实IP模块 with-threads 线程池模块,提高nginx性能 with-http_gzip_static_module 开启压缩功能 --with-http_v2_module 用于启用 Nginx 中的 HTTP/2 功能模块,以提供更快速和高效的 Web 服务 yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel # 添加用户和组, -s /sbin/nologin 不允许登陆的帐号,-M 没有/home的帐号,-g 添加到 nginx 组中 sudo groupadd nginx sudo useradd -s /sbin/nologin -M -g nginx nginx # 配置 .背景 在 k8s 里部署了应用需要通过 ingress 提供外部调用. ingressController Pod 应用部署在 A 机器上, 应用部署在 B 机器上.
通过自定义域名调用应用,则需要经过自定义域名配置的 host 的 kube-proxy 到 IngressController Pod 机器,再由 Ingress 负载找到应用的 Service 负载的 endpoint.
最终请求到应用的 Pod.
环境 k8s: 1.19 docker: 19.10 linux: CentOS7.6 分析思路 先确定 host:port 端口是否通达? 再确认 ingress 是否可以访问到 service IP ingress 关于作者 我的博客:https://yezihack.github.io
欢迎关注我的微信公众号【空树之空】,一日不学则面目可憎也,吾学也。1.1. 四大调度方式 1.1.1. 自动调试 1.1.2. 定向调度 1.1.2.1. NodeName 1.1.2.2. NodeSelector 1.1.3. 亲和性调度 1.1.3.1. NodeAffinity 1.1.3.2. PodAffinity 1.1.3.3. PodAntiAffinity 1.1.4. 污点(容忍)调度 1.1.4.1. 污点 1.1.4.2. 容忍 1.2. 参考 关于作者 1.1. 四大调度方式 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出 定向调度:NodeName、NodeSelector 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity 污点(容忍)调度:Taints、Toleration 1.1.1. 自动调试 完全交由 kube-scheduler 来决定 pod 调度到哪里,不受人为控制。
1.1.2. 定向调度 1.1.2.1. NodeName NodeName用于强制约束将Pod调度到指定的Name的Node节点上。这种方式,其实是直接跳过Scheduler的调度逻辑,直接将Pod调度到指定名称的节点。
使用实例:
apiVersion: v1 kind: Pod metadata: name: pod-nodename namespace: dev spec: nodeName: kube-11 # 指定调度到node1节点上 containers: - name: nginx image: nginx:1.17.1 tip: 这种调度不够灵活,必须指定某 node 节点,若 node 异常会导致调度失败。.1. 为什么升级 漏洞问题 使用新功能 .2. 特殊性 内网环境,没有外网。 多 master 集群。 外置 Etcd。 .3. 版本 kubeadm升级前版本:v1.16.0 kubeadm升级后版本:v1.16.15 .4. 升级前的检查 .4.1. 查看当前版本 kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"72c30166b2105cd7d3350f2c28a219e6abcd79eb", GitTreeState:"clean", BuildDate:"2020-01-18T23:29:13Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"linux/amd64"} .4.2. 离线下载 kubectl,kubeadm,kubelet 下载 # 必须本机没有安装以下软件 version="1.16.15" yumdownloader --resolve --destdir=/opt/local-packages/ kubelet-${version} kubeadm-${version} kubectl-${version} .4.3. 制作共享 YUM 源 使用工具:saber
假定本机IP:192.168.10.10
# 安装 Createrepo yum install createrepo -y createrepo /opt/local-packages/ # 如果存在 repodata 则使用更新 createrepo --update /opt/local-packages/ # 共享文件 saber fs /opt/local-packages/ .