当前位置: 首页 > news >正文

[云原生]三、Kubernetes(1.18)

主要内容:

1、kubernetes 简介
2、kubernetes 集群搭建
         方式搭建
         二进制方式搭建
3、 kubeadm kubernetes 核心技术
         YAML 文件详解
         kubectl 命令工具
         Pod
         Label
         Controller 控制器
         Volume
         PVC 和 PV
         Secret 和 configMap
         Namespace
         Service
         探针
         调度器
         集群安装机制 RBAC
         Helm
4、部署性能监控平台
5、搭建 kubernetes 高可用集群
6、kubernetes 部署项目
         Kubernete平台部署Java项目

1. kubernetes 简介

1.1 kubernetes 基本介绍

        kubernetes,简称 K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
        传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
        新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署, 由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。
        容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在 build 或 release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”, 这更便于监控和管理。
        Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。在 Kubernetes 中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的 管理、发现、访问 ,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

1.2 kubernetes 功能和架构

1.2.1 概述

        Kubernetes 是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过Kubernetes 能够进行应用的自动化部署和扩缩容。在 Kubernetes 中,会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes 积累了作为 Google 生产环境运行工作负载 10 多年的经验,并吸收了来自于社区的最佳想法和实践。

1.2.2 K8s 功能:

(1)自动装箱
        基于容器对应用运行环境的资源配置要求自动部署应用容器
(2)自我修复(自愈能力)
        当容器失败时,会对容器进行重启
        当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
(3)水平扩展
        通过简单的命令、用户 UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
(3)服务发现
        用户不需使用额外的服务发现机制,就能够基于 Kubernetes 自身能力实现服务发现和负载均衡
(4)滚动更新
        可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
(5)版本回退
        可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
(6)密钥和配置管理
        在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
(7)存储编排
        自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
(8)批处理
        提供一次性任务,定时任务;满足批量数据处理和分析的场景

1.2.3 应用部署架构分类

(1) 无中心节点架构
        GlusterFS
(2) 有中心节点架构
        HDFS
        K8S

1.2.4 k8s 集群架构

1.2.5 k8s 集群架构节点角色功能

Master Node
        k8s 集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
        Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和
Controller MangerServer 所组成
Worker Node
        集群工作节点,运行用户业务应用容器;
        Worker Node 包含 kubelet、kube proxy 和 ContainerRuntime;
       

2. kubernetes 集群搭建

2.1 K8S集群搭建 -- kubeadm方式

2.1.1 前置知识点

目前生产部署 Kubernetes 集群主要有两种方式:
(1)kubeadm
        Kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群。
        官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
(2)二进制包
        从 github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。

2.1.2 kubeadm 部署方式介绍

        kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个 kubernetes 集群的部署:
        第一、创建一个 Master 节点 kubeadm init
        第二, 将 Node 节点加入到当前集群中 $ kubeadm join <Master 节点的 IP 和端口 >

2.1.3 安装要求

在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件:
        - 一台或多台机器,操作系统 CentOS7.x-86_x64
        - 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
        - 集群中所有机器之间网络互通
        - 可以访问外网,需要拉取镜像
        - 禁止 swap 分区

2.1.4 最终目标

(1)在所有节点上安装 Docker 和 kubeadm
(2)部署 Kubernetes Master
(3)部署容器网络插件
(4)部署 Kubernetes Node,将节点加入 Kubernetes 集群中
(5)部署 Dashboard Web 页面,可视化查看 Kubernetes 资源
        

2.1.5 准备环境

2.1.6 系统初始化

 1. 关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
2. 关闭 selinux:
$ sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
$ setenforce 0 # 临时
可以使用以下命令来检查当前系统中 SELinux 的状态是否开启:
```bash
sestatus
```
通过运行上述命令,您将能够查看 SELinux 的当前状态,
包括是否为 enforcing(强制执行)、permissive(宽容)或 disabled(禁用)。
3. 关闭 swap:
$ swapoff -a # 临时
$ vim /etc/fstab # 永久
$ swapon # 开启
$ swapon --show  查看

4. 修改主机名:
$ hostnamectl set-hostname <hostname>
或者
$ vim /etc/hostname
5. 在 master 添加 hosts:
$ cat >> /etc/hosts << EOF
192.168.31.61 k8s-master
192.168.31.62 k8s-node1
192.168.31.63 k8s-node2
EOF
6. 将桥接的 IPv4 流量传递到 iptables 的链:
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
$ sysctl --system  生效这段配置主要用于配置网络桥的网络过滤功能,对于 Kubernetes 等容器化平台来说是必要的设置。具体来说,这段配置指定了两个参数:1. `net.bridge.bridge-nf-call-ip6tables = 1`:这个参数指示内核在桥接网络数据包到 IPv6 地址时,调用 IP6tables 进行数据包过滤。
2. `net.bridge.bridge-nf-call-iptables = 1`:这个参数指示内核在桥接网络数据包到 IPv4 地址时,调用 iptables 进行数据包过滤。
这些参数的设置对于 Kubernetes 等容器平台非常重要,以确保网络的正确和安全运行。通过将这些参数设置为1,可以确保桥接网络数据包按照规则进行过滤,以帮助保护容器网络的安全性和稳定性。在设置完成后,通过运行 `sysctl --system` 命令可以使这些配置立即生效。这样一来,你的系统就会按照配置中指定的参数来处理桥接网络数据包的过滤。

这些配置参数的含义是:

  1. net.bridge.bridge-nf-call-ip6tables = 1:当通过桥接网络接收到IPv6数据包时,将调用ip6tables的规则进行处理。
  2. net.bridge.bridge-nf-call-iptables = 1:当通过桥接网络接收到IPv4数据包时,将调用iptables的规则进行处理。
  3. net.ipv4.ip_forward = 1:允许IPv4的数据包转发,即使数据包的目标不是本机。
  4. vm.swappiness = 0: vm.swappiness是操作系统控制物理内存交换出去的策略。它允许的值是一个百分比的值,最小为0,最大运行100,该值默认为60。vm.swappiness设置为0表示尽量少swap,100表示尽量将inactive的内存页交换出去。

        Kubernetes通过iptables实现服务发现和网络流量路由,pod通信。这一步很重要。没有设置的话会导致集群网络通信故障,如pod无法通信。

7. 时间同步:
$ yum install ntpdate -y
$ ntpdate time.windows.com使用以前请先ping相应的域名查看网络是否可达,和相应的访问速度
ntp.ntsc.ac.cn   中国国家授时中心
cn.ntp.org.cn    中国授时阿里云NTP时间源服务器
ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com国内一些大学NTP时间源服务器
s1a.time.edu.cn   北京邮电大学
s1b.time.edu.cn   清华大学
s1c.time.edu.cn   北京大学
s1d.time.edu.cn   东南大学
s1e.time.edu.cn   清华大学
s2a.time.edu.cn   清华大学
s2b.time.edu.cn   清华大学
s2c.time.edu.cn   北京邮电大学
s2d.time.edu.cn   西南地区网络中心
s2e.time.edu.cn   西北地区网络中心
s2f.time.edu.cn   东北地区网络中心
s2g.time.edu.cn   华东南地区网络中心
s2h.time.edu.cn   四川大学网络管理中心
s2j.time.edu.cn   大连理工大学网络中心
s2k.time.edu.cn   CERNET桂林主节点
s2m.time.edu.cn   北京大学另外,如果服务器在国外,苹果提供的公共NTP服务,以下7个域名
http://time1.apple.com
http://time2.apple.com
http://time3.apple.com
http://time4.apple.com
http://time5.apple.com
http://time6.apple.com
http://time7.apple.comGoogle(谷歌)提供的NTP服务,以下4个域名
http://time1.google.com
http://time2.google.com
http://time3.google.com
http://time4.google.com

2.1.7 所有节点安装 Docker/kubeadm/kubelet

阿里云教程:

kubernetes镜像_kubernetes下载地址_kubernetes安装教程-阿里巴巴开源镜像站 (aliyun.com)

Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。
(1)安装 Docker
# 移除旧版本docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-eng

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 论文阅读:Most Probable Densest Subgraphs
  • 二手车交易系统开发设计源码及功能解析
  • M21170G-12
  • Unity射击游戏开发教程:(31)制造一定追踪行为的敌人
  • 使用QNetworkAccessManager实现FTP上传下载功能
  • 反序列化靶机实战serial(保姆级教程)
  • jupyter for c++
  • java进阶 CompletableFuture
  • Python 设计模式之工厂函数模式
  • stem32江科大自学笔记
  • nodeJS的一点个人总结
  • C语言time库
  • linux shell 脚本 之 getopt
  • 【Mysql】第一章 (环境配置)
  • SpringBoot简单项目(二维码扫描)
  • [case10]使用RSQL实现端到端的动态查询
  • 2019年如何成为全栈工程师?
  • AHK 中 = 和 == 等比较运算符的用法
  • Javascript编码规范
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • log4j2输出到kafka
  • nodejs调试方法
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 给Prometheus造假数据的方法
  • 汉诺塔算法
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 数据仓库的几种建模方法
  • 思否第一天
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 阿里云ACE认证学习知识点梳理
  • 仓管云——企业云erp功能有哪些?
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​比特币大跌的 2 个原因
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • (4)Elastix图像配准:3D图像
  • (不用互三)AI绘画工具应该如何选择
  • (超详细)语音信号处理之特征提取
  • (十五)使用Nexus创建Maven私服
  • (算法)硬币问题
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)scrum常见工具列表
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .a文件和.so文件
  • .net dataexcel 脚本公式 函数源码
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [android] 看博客学习hashCode()和equals()