Kubernetes

第一章 kubernetes

1.1 应用部署方式演变

- 传统部署时代:
早期,各机构是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程式资源利用率不高时,剩余资源无法被分配给其他应用程式, 而且维护许多物理服务器的成本很高。
- 虚拟化部署时代:
因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。
虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可伸缩性,以及降低硬件成本等等的好处。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统(OS
- 容器部署时代:
容器类似于 VM,但是更宽松的隔离特性使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
在这里插入图片描述
容器的横向扩缩容,容器容灾?
容器编排软件
Swarm Docker容器编排工具
Mesos Apache的资源统一管理的工具,需要Marathon结合使用
Kubernetes Googles开源的的容器编排工具

1.2 kubernetes简介

在这里插入图片描述

kubetnetes, 是一个全新的基于容器技术的分布式解决方案。谷歌运行了十几年的–Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。
Kubernetes 的本质是一组服务器集群,它可以在集群的每个节点上运行特定程序,来对节点的容器进行管理
它的目的是实现资源管理的自动化,提供以下功能。

  • 自我修复
  • 弹性收缩
  • 服务发现
  • 负载均
  • 版本回退
  • 存储编排

1.3 kubernetes组件

一个Kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会有安装不同的组件。
master:集群的控制平面,负责集群的决策。

Apiserver : 资源操作的唯一入口,接收用户的输入命令,提供认证、授权、API注册和发现等级制。
Scheduler: 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上。
ControllerManager: 负责维护集群状态,比如程序部署安排、故障检测、自动扩展、滚动更新等。
Etcd : 负责存储集群中各种资源对象信息。

node:集群的数据平面,负责为容器提供运行环境。

Kuberlet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器。
KubeProxy : 负责提供集群内部的服务器发现和负载均衡。
Docker: 负责节点上容器的各种操作。
在这里插入图片描述
以部署一个Nginx说明Kubernetes系统各种组件调用关系

  • Kubernetes环境启动后,master和node都会将自身的信息存储到etcd 数据库中。
  • 一个Nginx服务的安装请求,首先发送到 master节点的 apiServer 组件。
  • apiServer 组件会调用schedule组件来决定应该把这个服务安装到哪个node节点上,此时它会从etcd 中读取各个node节点的信息,然后 按照一定的算法进行选择,并将结果告知apiServer。
  • apiServer 调用controller-manger去调度Node节点安装Nginx服务。
  • Kubernetes接收到指令后,会通知docker,然后由docker来启动一个Nginx的Pod,Pod是Kubernetes的最小操作单元,容器必须跑在pod中。
  • 一个Nginx就运行了,如果需要访问Nginx,就需要通过kube-proxy 来对pod产生访问的代理,外界用户就可以访问集群中的Nginx服务了。

1.4 kubernetes概念

Master: 集群控制节点,每个集群至少需要一个master节点负责集群的管控。
Node: 工作负载节点,由master分配容器到node工作节点上,然后node节点上的docker负责容器的运行。
Pod: Kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器。
controller:控制器,通过它实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等。
Service: pod对外服务的统一入口,下面可以维护着同一类的多个pod。
Label : 标签,用于pod进行分类,同一类pod回拥有相同的标签。
Namespace:命名空间,用来隔离pod的运行环境。
在这里插入图片描述

第二章 集群环境搭建

2.1环境规划

2.1.1集群类型

Kubernetes集群分为两类:一主多从 、多主多从。

  • 一主多从:一台master节点和多台node节点,搭建简单,有单机故障。适合用于测试环境。
  • 多主多从: 多台master节点和多台node节点,搭建麻烦,安全性高,适合用于生产环境。
    在这里插入图片描述

2.1.2安装方式

Kubernetes有多种部署方式,目前有kubeadm、minkube、二进制包。

  • minkube : 一个用于快速搭建单节点Kubernetes的工具。
  • kubeadm: 一个用于快速搭建Kubernetes集群的工具。
  • 二进制包:从官网下载每个组件的二进制包,一次去安装,此方式对于理解Kubernetes组件更加有效。

2.1.3主机规划

作用 IP地址 操作系统 配置
Master 192.168.68.100 centos 2颗 2G内存 50G硬盘
Node1 192.168.68.101 centos 2颗 2G内存 50G硬盘
Node2 192.168.68.102 centos 2颗 2G内存 50G硬盘

2.2环境搭建

三台linux系统(一主二从),内置Centos7.5 系统每台linux分别安装docker、Kubeadm、kubelet、kubectl程序。
2.2.1 主机安装
1 安装虚拟机过程中注意下面的设置:
操作系统 :CPU(2颗) 内存(2G) 硬盘(50G)
2 语言选择: 中文简体

K8s集群安装
一、环境准备
1.检查操作系统的版本(推荐使用7.5以上的版本)
cat /etc/redhat-release
[root@master ~]# cat /etc/redhat-release
Rocky Linux release 8.6 (Green Obsidian)
2.主机名的解析
为了方便后面集群节点间的直接调用,在/etc/hosts文件添加下面信息
192.168.208.10 master
192.168.208.11 node1
192.168.208.12 node2
验证:
ping master node1 node2
[root@master ~]# ping master
PING master (192.168.208.10) 56(84) bytes of data.
64 bytes from master (192.168.208.10): icmp_seq=1 ttl=64 time=0.983 ms
64 bytes from master (192.168.208.10): icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from master (192.168.208.10): icmp_seq=3 ttl=64 time=0.041 ms
c64 bytes from master (192.168.208.10): icmp_seq=4 ttl=64 time=0.045 ms
64 bytes from master (192.168.208.10): icmp_seq=5 ttl=64 time=0.041 ms
3.时间同步
kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间
#启动chronyd服务
systemctl start chronyd
#设置chronyd服务开机启动
systemctl enable chronyd
验证
使用date命令查看时间是否同步了,结果一致

  1. 禁用iptables和firewalld服务
    kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则和他们混淆,直接关闭系统的防火墙
    #关闭firewalld服务
    systemctl stop firewalld
    #禁止firewalld服务开机启动
    systemctl disable firewalld

#关闭iptables服务
systemctl stop iptables
#禁止iptables服务开机启动
systemctl disable iptables
5. 禁用selinux
selinux是linux系统的一个安全服务,不关闭会产生各种各样的问题
编辑/etc/selinux/config文件,修改SELINUX的值为disabled,修改后重启linux服务
[root@master ~]# more /etc/selinux/config
This file controls the state of SELinux on the system.
SELINUX= can take one of these three values:
enforcing - SELinux security policy is enforced.
permissive - SELinux prints warnings instead of enforcing.
disabled - No SELinux policy is loaded.
SELINUX=disabled
SELINUXTYPE= can take one of these three values:
targeted - Targeted processes are protected,
minimum - Modification of targeted policy. Only selected processes are protected.
mls - Multi Level Security protection.
SELINUXTYPE=targeted
验证 getenforce
6.禁用swap分区
swapoff -a
vim /etc/fstab
#/etc/fstab
#Created by anaconda on Wed Jun 29 23:00:06 2022

#Accessible filesystems, by reference, are maintained under ‘/dev/disk/’.
#See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.

#After editing this file, run ‘systemctl daemon-reload’ to update systemd
#units generated from this file.

/dev/mapper/rl-root / xfs defaults 0 0
UUID=5fcb08a7-01d6-4b9a-955d-4f11642515d4 /boot xfs defaults 0 0
#/dev/mapper/rl-swap none swap defaults 0 0
7.修改linux内核参数
编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip.forward = 1
重新加载配置
sysctl -p
加载网桥过滤模块
modprobe br_netfilter
查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter
[root@master ~]# lsmod | grep br_netfilter
br_netfilter 24576 0
bridge 278528 1 br_netfilter
8. 配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的,两者比较的话,ipvs性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
安装ipset和ipvsadm
1 yum install ipset ipvsadmin -y
#如果提示No package ipvsadmin available.需要使用
yum install ipvsadm
2 添加需要加载的模块写入脚本文件 /etc/sysconfig/modules/ipvs.modules
modprobe – ip_vs
modprobe – ip_vs_rr
modprobe – ip_vs_wrr
modprobe – ip_vs_sh
modprobe – nf_conntrack
[root@master ~]# yum install ipset ipvsadmin -y
2.1添加需要加载的模块写入脚本文件
[root@master ~]# cat < /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe – ip_vs
modprobe – ip_vs_rr
modprobe – ip_vs_wrr
modprobe – ip_vs_sh
modprobe – nf_conntrack
EOF

添加脚本执行文件执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
执行脚本
/bin/bash /etc/sysconfig/modules/ipvs.modules
验证模块加载是否成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs 172032 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 172032 6 xt_conntrack,nf_nat,ipt_MASQUERADE,xt_nat,nf_conntrack_netlink,ip_vs
nf_defrag_ipv6 20480 2 nf_conntrack,ip_vs
libcrc32c 16384 5 nf_conntrack,nf_nat,nf_tables,xfs,ip_vs
9.重启服务
reboot init 6
10.查看配置是否生效
selinux 和 swap 是否都已经禁用
#查看selinux状态
getenforce
#查看内存使用情况
free -m
二、组件安装(docker、kubeadm、kubelet、kubectl)
1.docker安装
#切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#查看当前镜像中支持的docker版本
yum list docker-ce --showduplicates
#安装指定版本的docker-ce
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
#添加docker的配置文件 /etc/docker/daemon.json
{
“exec-opts” : [“native.cgroupdriver=systemd”],
“registry-mirrors”: [“https://k1ktap5m.mirror.aliyuncs.com”]
}
#启动docker
systemctl start docker
#设置docker开机自启
systemctl enable docker
2.安装k8s组件
#切换国内镜像源
#编辑/etc/yum.repos.d/kubernetes.repo,添加下面配置
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
#安装kubeadm、kubelet、kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
#配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet,添加如下配置
KUBELET_CGROUP_ARGS=“–cgroup-driver=systemd”
KUBE_PROXY_MODE=“ipvs”

#设置开机自启
systemctl enable kubelet
3.准备集群镜像
3.1 查看所需镜像名称和版本
kubeadm config images list
[root@master ~]# kubeadm config images list
I0703 05:04:26.218241 141570 version.go:251] remote version is much newer: v1.24.2; falling back to: stable-1.17
W0703 05:04:27.333366 141570 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0703 05:04:27.333383 141570 validation.go:28] Cannot validate kubelet config - no validator is available
k8s.gcr.io/kube-apiserver:v1.17.17
k8s.gcr.io/kube-controller-manager:v1.17.17
k8s.gcr.io/kube-scheduler:v1.17.17
k8s.gcr.io/kube-proxy:v1.17.17
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
3.2 由于网络原因,需要先从阿里云镜像仓库中下载镜像然后重新命名镜像名称
1 定义变量
images=(
k8s.gcr.io/kube-apiserver:v1.17.17
k8s.gcr.io/kube-controller-manager:v1.17.17
k8s.gcr.io/kube-scheduler:v1.17.17
k8s.gcr.io/kube-proxy:v1.17.17
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
2 阿里镜像下载,改标签 删除源镜像名
for imageName in i m a g e s [ @ ] ; d o d o c k e r p u l l r e g i s

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值