一,Kubernetes简介

1.部署方式的变迁

1.1.背景

image.png

  • 传统部署时代:

    • 在物理服务器上运行应用程序
    • 无法为应用程序定义资源边界
    • 导致资源分配问题

    例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况, 结果可能导致其他应用程序的性能下降。 一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展, 并且维护许多物理服务器的成本很高。

  • 虚拟化部署时代:

    • 作为解决方案,引入了虚拟化
    • 虚拟化技术允许你在单个物理服务器的 CPU 上运行多个虚拟机(VM)
    • 虚拟化允许应用程序在 VM 之间隔离,并提供一定程度的安全
    • 一个应用程序的信息 不能被另一应用程序随意访问。
    • 虚拟化技术能够更好地利用物理服务器上的资源
    • 因为可轻松地添加或更新应用程序 ,所以可以实现更好的可伸缩性,降低硬件成本等等。
    • 每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

缺点:虚拟层冗余导致的资源浪费与性能下降

  • 容器部署时代:
    • 容器类似于 VM,但可以在应用程序之间共享操作系统(OS)。
    • 容器被认为是轻量级的。
    • 容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。
    • 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
    • 参照【Docker隔离原理- namespace 6项隔离(资源隔离)与 cgroups 8项资源限制(资源限制)】

裸金属:真正的物理服务器

容器优势:

  • 敏捷性:敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
  • 及时性:持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性),支持可靠且频繁的 容器镜像构建和部署。
  • 解耦性:关注开发与运维的分离:在构建/发布时创建应用程序容器镜像,而不是在部署时。 从而将应用程序与基础架构分离。
  • 可观测性:可观察性不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
  • 跨平台:跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
  • 可移植:跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
  • 简易性:以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
  • 大分布式:松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
  • 隔离性:资源隔离:可预测的应用程序性能。
  • 高效性:资源利用:高效率和高密度

K8S之前: 10台服务器:25+15中间件 K8S之后: 10台服务器:上百个应用了。 k8s管理10几台服务器。资源规划。

1.2 容器化问题

  • 弹性的容器化应用管理
  • 强大的故障转移能力
  • 高性能的负载均衡访问机制
  • 便捷的扩展
  • 自动化的资源监测
  • ……

docker swarm:大规模进行容器编排 mesos:apache Kubernetes : google; 竞品: Kubernetes 胜利

1.3 为什么用kubernrtes

容器是打包和运行应用程序的好方式。在生产环境中,你需要管理运行应用程序的容器,并确保不会停机。 例如,如果一个容器发生故障,则需要启动另一个容器。如果系统处理此行为,会不会更容易?

这就是 Kubernetes 来解决这些问题的方法! Kubernetes 为你提供了一个可弹性运行分布式系统的框架。linux之上的一个服务编排框架;

Kubernetes 会满足你的扩展要求、故障转移、部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary 部署。

Kubernetes 为你提供:

  • 服务发现和负载均衡
    Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
  • 存储编排
    Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
  • 自动部署和回滚
    你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
  • 自动完成装箱计算
    Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
  • 自我修复
    Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
  • 密钥与配置管理
    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥
  • …….


为了生产环境的容器化大规模应用编排,必须有一个自动化的框架。系统

2.简介

Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。

名称 Kubernetes 源于希腊语,意为“舵手”或“飞行员”。Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 在大规模运行生产工作负载方面拥有十几年的经验 的基础上,结合了社区中最好的想法和实践。

2.1 Kubernetes 不是什么

  • Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。
  • Kubernetes 在容器级别而不是在硬件级别运行
  • 它提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡、日志记录和监视。
  • 但是,Kubernetes 不是单体系统,默认解决方案都是可选和可插拔的。 Kubernetes 提供了构建开发人员平台的基础,但是在重要的地方保留了用户的选择和灵活性。

Kubernetes:

  • 不限制支持的应用程序类型。 Kubernetes 旨在支持极其多种多样的工作负载,包括无状态、有状态和数据处理工作负载。 如果应用程序可以在容器中运行,那么它应该可以在 Kubernetes 上很好地运行。
  • 不部署源代码,也不构建你的应用程序。 持续集成(CI)、交付和部署(CI/CD)工作流取决于组织的文化和偏好以及技术要求。
  • 不提供应用程序级别的服务作为内置服务,例如中间件(例如,消息中间件)、 数据处理框架(例如,Spark)、数据库(例如,mysql)、缓存、集群存储系统 (例如,Ceph)。这样的组件可以在 Kubernetes 上运行,并且/或者可以由运行在 Kubernetes 上的应用程序通过可移植机制(例如, 开放服务代理)来访问。
  • 不要求日志记录、监视或警报解决方案。 它提供了一些集成作为概念证明,并提供了收集和导出指标的机制。
  • 不提供或不要求配置语言/系统(例如 jsonnet),它提供了声明性 API, 该声明性 API 可以由任意形式的声明性规范所构成。RESTful;写yaml文件
  • 不提供也不采用任何全面的机器配置、维护、管理或自我修复系统。
  • 此外,Kubernetes 不仅仅是一个编排系统,实际上它消除了编排的需要。 编排的技术定义是执行已定义的工作流程:首先执行 A,然后执行 B,再执行 C。 相比之下,Kubernetes 包含一组独立的、可组合的控制过程, 这些过程连续地将当前状态驱动到所提供的所需状态。 如何从 A 到 C 的方式无关紧要,也不需要集中控制,这使得系统更易于使用 且功能更强大、系统更健壮、更为弹性和可扩展。

容器管家:

安装了很多应用。 ————————————- qq电脑管家。(自动杀垃圾,自动卸载没用东西….)

机器上有很多容器。 ————————————— kubernete容器的管家。(容器的启动停止、故障转义、负载均衡等)

二,Kubernetes安装

1.集群原理

集群: 主从:

  • 主从同步/复制 ;mysql 主 — mysql 从
  • 主管理从 v

分片(数据集群):

  • 大家都一样
  • 每个人存一部分东西

1.1 master-node 架构

11000台机器

地主+奴隶

地(机器)

奴隶(在机器上干活)

master:主节点(地主)。可能有很多(多人控股公司)

node:work节点(工作节点)。 很多。真正干应用的活

1619061915065.png

  1. master worker怎么交互

master决定worker里面都有什么

worker只是和master (API) 通信; 每一个节点自己干自己的活

程序员使用UI或者CLI操作k8s集群的master,就可以知道整个集群的状况。

1.2 工作原理

components-of-kubernetes.svg

  1. master节点(Control Plane【控制面板】):master节点控制整个集群

master节点上有一些核心组件:

  • Controller Manager:控制管理器
  • etcd:键值数据库(redis)【记账本,记事本】
  • scheduler:调度器
  • api server:api网关(所有的控制都需要通过api-server)

node节点(worker工作节点):

  • kubelet(监工):每一个node节点上必须安装的组件。
  • kube-proxy:代理。代理网络

部署一个应用? 程序员:调用CLI告诉master,我们现在要部署一个tomcat应用

  • 程序员的所有调用都先去master节点的网关api-server。这是matser的唯一入口(mvc模式中的c层)
  • 收到的请求先交给master的api-server。由api-server交给controller-mannager进行控制
  • controller-mannager 进行 应用部署
  • controller-mannager 会生成一次部署信息。 tomcat —image:tomcat6 —port 8080 ,真正不部署应用
  • 部署信息被记录在etcd中
  • scheduler调度器从etcd数据库中,拿到要部署的应用,开始调度。看哪个节点合适,
  • scheduler把算出来的调度信息再放到etcd中
  • 每一个node节点的监控kubelet,随时和master保持联系的(给api-server发送请求不断获取最新数据),所有节点的kubelet就会从master
  • 假设node2的kubelet最终收到了命令,要部署。
  • kubelet就自己run一个应用在当前机器上,随时给master汇报当前应用的状态信息,分配ip
  • node和master是通过master的api-server联系的
  • 每一个机器上的kube-proxy能知道集群的所有网络。只要node访问别人或者别人访问node,node上的kube-proxy网络代理自动计算进行流量转发

下图和上图一样

1619075196642.png
无论访问哪个机器,都可以访问到真正的应用(Service【服务】)

1.3 原理分解

1.主节点(master)

1619062152511.png

快速介绍:

  • master也要装kubelet和kubeproxy
  • 前端访问(UI\CLI):
  • kube-apiserver:
  • scheduler:
  • controller manager:
  • etcd
  • kubelet+kubeproxy每一个节点的必备+docker(容器运行时环境)

2.工作节点(node)

1619062201206.png

  • 快速介绍:
  • Pod:

    • docker run 启动的是一个container(容器),容器是docker的基本单位,一个应用是一个容器
    • kubelet run 启动的一个应用称为一个Pod;Pod是k8s的基本单位。

      • Pod是容器的一个再封装
      • atguigu(永远不变) ==slf4j= log4j(类)
      • 应用 ===== Pod ======= docker的容器
      • 一个容器往往代表不了一个基本应用。博客(php+mysql合起来完成)
      • 准备一个Pod 可以包含多个 container;一个Pod代表一个基本的应用。
      • IPod(看电影、听音乐、玩游戏)【一个基本产品,原子】;
      • Pod(music container、movie container)【一个基本产品,原子的】
  • Kubelet:监工,负责交互master的api-server以及当前机器的应用启停等,在master机器就是master的小助手。每一台机器真正干活的都是这个 Kubelet

  • Kube-proxy:
  • 其他:

2.组件交互原理

1619076211983.png

想让k8s部署一个tomcat?

  1. 开机默认所有节点的kubelet、master节点的scheduler(调度器)、controller-manager(控制管理器)一直监听master的api-server发来的事件变化(for ::)

  2. 程序员使用命令行工具: kubectl ; kubectl create deploy tomcat —image=tomcat8(告诉master让集群使用tomcat8镜像,部署一个tomcat应用)

  3. kubectl命令行内容发给api-server,api-server保存此次创建信息到etcd

  4. etcd给api-server上报事件,说刚才有人给我里面保存一个信息。(部署Tomcat[deploy])

  5. controller-manager监听到api-server的事件,是 (部署Tomcat[deploy])

  6. controller-manager 处理这个 (部署Tomcat[deploy])的事件。controller-manager会生成Pod的部署信息【pod信息】

  7. controller-manager 把Pod的信息交给api-server,再保存到etcd

  8. etcd上报事件【pod信息】给api-server。

  9. scheduler专门监听 【pod信息】 ,拿到 【pod信息】的内容,计算,看哪个节点合适部署这个Pod【pod调度过后的信息(node: node-02)】,

  10. scheduler把 【pod调度过后的信息(node: node-02)】交给api-server保存给etcd

  11. etcd上报事件【pod调度过后的信息(node: node-02)】,给api-server

  12. 其他节点的kubelet专门监听 【pod调度过后的信息(node: node-02)】 事件,集群所有节点kubelet从api-server就拿到了 【pod调度过后的信息(node: node-02)】 事件

  13. 每个节点的kubelet判断是否属于自己的事情;node-02的kubelet发现是他的事情

  14. node-02的kubelet启动这个pod。汇报给master当前启动好的所有信息

3.安装

3.1 理解

安装方式

  • 二进制方式(建议生产环境使用)
  • MiniKube…..
  • kubeadm引导方式(官方推荐)
    • GA

大致流程

  • 准备N台服务器,内网互通
  • 安装Docker容器化环境【k8s放弃dockershim】
  • 安装Kubernetes
    • 三台机器安装核心组件(kubeadm(创建集群的引导工具), kubeletkubectl(程序员用的命令行)
    • kubelet可以直接通过容器化的方式创建出之前的核心组件(api-server)【官方把核心组件做成镜像】
    • 由kubeadm引导创建集群

3.2执行

1.准备机器

  • 开通三台机器,内网互通,配置公网ip。centos7.8/7.9,基础实验2c4g三台也可以
  • 每台机器的hostname不要用localhost,可用k8s-01,k8s-02,k8s-03之类的【不包含下划线、小数点、大写字母】(这个后续步骤也可以做)

    2.安装前置环境

基础环境
**

  1. #########################################################################
  2. #关闭防火墙: 如果是云服务器,需要设置安全组策略放行端口
  3. # https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#check-required-ports
  4. systemctl stop firewalld
  5. systemctl disable firewalld
  6. # 修改 hostname
  7. hostnamectl set-hostname k8s-01
  8. # 查看修改结果
  9. hostnamectl status
  10. # 设置 hostname 解析
  11. echo "127.0.0.1 $(hostname)" >> /etc/hosts
  12. #关闭 selinux
  13. sed -i 's/enforcing/disabled/' /etc/selinux/config
  14. setenforce 0
  15. #关闭 swap
  16. swapoff -a
  17. sed -ri 's/.*swap.*/#&/' /etc/fstab
  18. #允许 iptables 检查桥接流量
  19. #https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%E5%85%81%E8%AE%B8-iptables-%E6%A3%80%E6%9F%A5%E6%A1%A5%E6%8E%A5%E6%B5%81%E9%87%8F
  20. ## 开启br_netfilter
  21. ## sudo modprobe br_netfilter
  22. ## 确认下
  23. ## lsmod | grep br_netfilter
  24. ## 修改配置
  25. #####这里用这个,不要用课堂上的配置。。。。。。。。。
  26. #将桥接的 IPv4 流量传递到 iptables 的链:
  27. # 修改 /etc/sysctl.conf
  28. # 如果有配置,则修改
  29. sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.conf
  30. sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.conf
  31. sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf
  32. sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g" /etc/sysctl.conf
  33. sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g" /etc/sysctl.conf
  34. sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g" /etc/sysctl.conf
  35. sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g" /etc/sysctl.conf
  36. # 可能没有,追加
  37. echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
  38. echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
  39. echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
  40. echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
  41. echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
  42. echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf
  43. echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
  44. # 执行命令以应用
  45. sysctl -p
  46. #################################################################

docker环境
**

  1. sudo yum remove docker*
  2. sudo yum install -y yum-utils
  3. #配置docker yum
  4. sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  5. #安装docker 19.03.9
  6. yum install -y docker-ce-3:19.03.9-3.el7.x86_64 docker-ce-cli-3:19.03.9-3.el7.x86_64 containerd.io
  7. #安装docker 19.03.9 docker-ce 19.03.9
  8. yum install -y docker-ce-19.03.9-3 docker-ce-cli-19.03.9 containerd.io
  9. #启动服务
  10. systemctl start docker
  11. systemctl enable docker
  12. #配置加速
  13. sudo mkdir -p /etc/docker
  14. sudo tee /etc/docker/daemon.json <<-'EOF'
  15. {
  16. "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]
  17. }
  18. EOF
  19. sudo systemctl daemon-reload
  20. sudo systemctl restart docker

安装k8s核心
**

  1. # 配置K8Syum
  2. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  3. [kubernetes]
  4. name=Kubernetes
  5. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  6. enabled=1
  7. gpgcheck=0
  8. repo_gpgcheck=0
  9. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  10. http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  11. EOF
  12. # 卸载旧版本
  13. yum remove -y kubelet kubeadm kubectl
  14. # 查看可以安装的版本
  15. yum list kubelet --showduplicates | sort -r
  16. # 安装kubeletkubeadmkubectl 指定版本
  17. yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
  18. # 开机启动kubelet
  19. systemctl enable kubelet && systemctl start kubelet

初始化master节点
**

  1. ############下载核心镜像 kubeadm config images list:查看需要哪些镜像###########
  2. ####封装成images.sh文件
  3. #!/bin/bash
  4. images=(
  5. kube-apiserver:v1.21.0
  6. kube-proxy:v1.21.0
  7. kube-controller-manager:v1.21.0
  8. kube-scheduler:v1.21.0
  9. coredns:v1.8.0
  10. etcd:3.4.13-0
  11. pause:3.4.1
  12. )
  13. for imageName in ${images[@]} ; do
  14. docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
  15. done
  16. #####封装结束
  17. chmod +x images.sh && ./images.sh
  18. # registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/coredns:v1.8.0
  19. ##注意1.21.0版本的k8s coredns镜像比较特殊,结合阿里云需要特殊处理,重新打标签
  20. docker tag registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/coredns:v1.8.0 registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/coredns/coredns:v1.8.0
  21. ########kubeadm init 一个master########################
  22. ########kubeadm join 其他worker########################
  23. kubeadm init \
  24. --apiserver-advertise-address=10.170.11.8 \
  25. --image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
  26. --kubernetes-version v1.21.0 \
  27. --service-cidr=10.96.0.0/16 \
  28. --pod-network-cidr=192.168.0.0/16
  29. ## 注意:pod-cidrservice-cidr
  30. # cidr 无类别域间路由(Classless Inter-Domain RoutingCIDR
  31. # 指定一个网络可达范围 pod的子网范围+service负载均衡网络的子网范围+本机ip的子网范围不能有重复域
  32. ######按照提示继续######
  33. ## init完成后第一步:复制相关文件夹
  34. To start using your cluster, you need to run the following as a regular user:
  35. mkdir -p $HOME/.kube
  36. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  37. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  38. ## 导出环境变量
  39. Alternatively, if you are the root user, you can run:
  40. export KUBECONFIG=/etc/kubernetes/admin.conf
  41. ### 部署一个pod网络
  42. You should now deploy a pod network to the cluster.
  43. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  44. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  45. ##############如下:安装calico#####################
  46. kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
  47. ### 命令检查
  48. kubectl get pod -A ##获取集群中所有部署好的应用Pod
  49. kubectl get nodes ##查看集群所有机器的状态
  50. Then you can join any number of worker nodes by running the following on each as root:
  51. kubeadm join 172.24.80.222:6443 --token nz9azl.9bl27pyr4exy2wz4 \
  52. --discovery-token-ca-cert-hash sha256:4bdc81a83b80f6bdd30bb56225f9013006a45ed423f131ac256ffe16bae73a20

初始化worker节点
**

  1. ## master生成的命令即可
  2. kubeadm join 172.24.80.222:6443 --token nz9azl.9bl27pyr4exy2wz4 \
  3. --discovery-token-ca-cert-hash sha256:4bdc81a83b80f6bdd30bb56225f9013006a45ed423f131ac256ffe16bae73a20
  4. ##过期怎么办
  5. kubeadm token create --print-join-command
  6. kubeadm token create --ttl 0 --print-join-command
  7. kubeadm join --token y1eyw5.ylg568kvohfdsfco --discovery-token-ca-cert-hash sha256: 6c35e4f73f72afd89bf1c8c303ee55677d2cdb1342d67bb23c852aba2efc7c73

1619100578888.png
验证集群
**

  1. #获取所有节点
  2. kubectl get nodes
  3. #给节点打标签
  4. ## k8s中万物皆对象。node:机器 Pod:应用容器
  5. ###加标签 h1
  6. kubectl label node k8s-02 node-role.kubernetes.io/worker=''
  7. ###去标签
  8. kubectl label node k8s-02 node-role.kubernetes.io/worker-
  9. ## k8s集群,机器重启了会自动再加入集群,master重启了会自动再加入集群控制中心

设置ipvs模式
**
k8s整个集群为了访问通;默认是用iptables,性能低下(kube-proxy在集群之间同步iptables的内容)

  1. #1、查看默认kube-proxy 使用的模式
  2. kubectl logs -n kube-system kube-proxy-28xv4
  3. #2、需要修改 kube-proxy 的配置文件,修改mode ipvs。默认iptables,但是集群大了以后就很慢
  4. kubectl edit cm kube-proxy -n kube-system
  5. 修改如下
  6. ipvs:
  7. excludeCIDRs: null
  8. minSyncPeriod: 0s
  9. scheduler: ""
  10. strictARP: false
  11. syncPeriod: 30s
  12. kind: KubeProxyConfiguration
  13. metricsBindAddress: 127.0.0.1:10249
  14. mode: "ipvs"
  15. ###修改了kube-proxy的配置,为了让重新生效,需要杀掉以前的Kube-proxy
  16. kubectl get pod -A|grep kube-proxy
  17. kubectl delete pod kube-proxy-pqgnt -n kube-system
  18. ### 修改完成后可以重启kube-proxy以生效