1.K8S介绍
1.Kubernetes简介
Kubernetes 缩写:K8S,k 和 s 之间有八个字符,所以因此得名。
Kubernetes 由 google 的 Brog 系统作为原型,后经 Go 语言延用 Brog 的思路重写,并捐献给 CNCF 基金会开源。
Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。
官⽹:https://kubernetes.io
Github:https://github.com/kubernetes/kubernetes
2.Kubernetes功能
Kubernetes 的目标是让部署容器化的应用简单并且高效,提供了应用部署,规划,更新,维护的一种机制。
Kubernetes 在 Docker 等容器技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
主要功能:
1. 使用Docker 等容器技术对应用程序包装(package)、实例化 (instantiate) 、运行(run)。
2. 以集群的方式运行、管理跨机器的容器,解决 Docker 跨机器容器之间的通讯问题。
3. K8S 的自我修复机制使得容器集群总是运行在用户期望的状态。
3.Kubernetes 架构
K8S 属于主从设备模型(Mater-Slave 架构),由 Master 节点负责 集群的调度、管理和运维(分配活的),Slave 节点是运算工作负载节点(干活的),被称为 Worker Node 节点。
Master 需要占据一个独立服务器运行,因为其是整个集群的“大脑”,一旦宕机或不可用,那么所有控制命令都将失效,可对主节点进进行可用配置。
当 Worker Node 节点宕机时,其上的工作负载会被 Master 自动转移到其他节点上。
4.Kubernetes 工作流程
1. 运维⼈员使用kubectl 命令工具向 API Server 发送请求,API Server 接收请求后写入到 Etcd 中。
2. API Server 让 Controller-manager 按照预设模板去创建 Pod。
3. Controller-manager 通过 API Server 读取 Etcd 中用户的预设信息,再通过 API Server 找到 Scheduler,为新创建的 Pod 选择最合适的 Node 工作负载节点。
4. Scheduler 通过 API Server 在 Etcd 找到存储的 Node 节点元信息、剩余资源等,用预选和优选策略选择最优的 Node 节点。
5. Scheduler 确定 Node 节点后,通过 API Server 交给这个 Node 节点上的 Kubelet 进行 Pod 资源的创建。
6. Kubelet 调用容器引擎交互创建 Pod,同时将 Pod 监控信息通过 API Server 存储到 Etcd 中。
7. 当⽤户访问时,通过 Kube-proxy 负载、转发,访问相应的Pod。
8. 注:决定创建 Pod 清单的是 Controller-manager 控制器,Kubelet 和容器引擎只是干活的。
2.Kubeadm方式安装K8S
1.安装环境
创建三台主机,一台master,两台node,设置三台主机的基础配置(名称,ip地址,关闭防火墙,停用NetworkMansger,selinux)。
主机名 | ip地址 | 角色 |
k8s_master | 192.168.1.11 | master节点 |
k8s_node01 | 192.168.1.22 | work节点 |
k8s_node02 | 192.168.1.33 | work节点 |
2.前期准备
---master主机
1.配置主机映射
在etc/hosts挟持域名
[root@k8s_master ~]# vim /etc/hosts
2.在/etc/yum.repos.d/添加2个新的rope文件
[root@k8s_master ~]# cd /etc/yum.repos.d/
kubernetes
[root@k8s_master yum.repos.d]# vim kubernetes.repo
[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/rpmpackage-key.gpg
docker
[root@k8s_master yum.repos.d]# vim docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
清除缓存创建缓存
[root@k8s_master yum.repos.d]# yum clean all && yum makecache
3.安装常用工具
[root@k8s_master yum.repos.d]# yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git -y
4. 同步时间
安装 ntpdate
[root@k8s_master yum.repos.d]# yum -y install ntpdate
同步时间
[root@k8s_master yum.repos.d]# ntpdate time2.aliyun.com
4 Sep 10:07:38 ntpdate[2527]: adjust time server 203.107.6.88 offset 0.009177 sec
编写计划任务
[root@k8s_master yum.repos.d]# crontab -e
* 5 * * * /usr/sbin/ntpdate time2.aliyun.com
~
5.配置limit
单个进程可以打开的文件数量将被限制为 65535
[root@k8s_master yum.repos.d]# ulimit -SHn 65535
[root@k8s_master yum.repos.d]# vim /etc/security/limits.conf
#在末尾添加如下内容
* soft nofile 65536
* hard nofile 131072
* soft nproc 65535
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
centos文件的最高访问数量是1024
6.安装 k8s 高可用性 Git 仓库
[root@k8s_master yum.repos.d]# cd
[root@k8s_master ~]# git clone https://gitee.com/dukuan/k8s-ha-install.git
正克隆到 'k8s-ha-install'...
remote: Enumerating objects: 920, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 920 (delta 1), reused 0 (delta 0), pack-reused 912
接收对象中: 100% (920/920), 19.74 MiB | 2.93 MiB/s, done.
处理 delta 中: 100% (388/388), done.
7.重启
[root@k8s_master k8s-ha-install]# reboot
3.配置内核模块
1.配置ipvs模块
安装lvs ipvs相关的应用
[root@k8s_master ~]# yum install ipvsadm ipset sysstat conntrack libseccomp -y
[root@k8s_master ~]# modprobe -- ip_vs
[root@k8s_master ~]# modprobe -- ip_vs_rr
[root@k8s_master ~]# modprobe -- ip_vs_wrr
[root@k8s_master ~]# modprobe -- ip_vs_sh
[root@k8s_master ~]# modprobe -- nf_conntrack
[root@k8s_master ~]# find / -name "ipvs.conf"
[root@k8s_master ~]# vim /etc/modules-load.d/ipvs.conf
# 在系统启动时加载下列 IPVS 和相关功能所需的模块
ip_vs # 负载均衡模块
ip_vs_lc # 用于实现基于连接数量的负载均衡算法
ip_vs_wlc # 用于实现带权重的最少连接算法的模块
ip_vs_rr # 负载均衡rr算法模块
ip_vs_wrr # 负载均衡wrr算法模块
ip_vs_lblc # 负载均衡算法,它结合了最少连接(LC)算法和基于偏置的轮询(Round Robin with Bias)算法
ip_vs_lblcr # 用于实现基于链路层拥塞状况的最少连接负载调度算法的模块
ip_vs_dh # 用于实现基于散列(Hashing)的负载均衡算法的模块
ip_vs_sh # 用于源端负载均衡的模块
ip_vs_fo # 用于实现基于本地服务的负载均衡算法的模块
ip_vs_nq # 用于实现NQ算法的模块
ip_vs_sed # 用于实现随机早期检测(Random Early Detection)算法的模块
ip_vs_ftp # 用于实现FTP服务的负载均衡模块
ip_vs_sh
nf_conntrack # 用于跟踪⽹络连接的状态的模块
ip_tables # 用于管理防护墙的机制
ip_set # 用于创建和管理IP集合的模块
xt_set # 用于处理IP数据包集合的模块,提供了与iptables等网络工具的接口
ipt_set # 用于处理iptables规则集合的模块
ipt_rpfilter # 用于实现路由反向路径过滤的模块
ipt_REJECT # iptables模块之间,用于将不符合规则的数据包拒绝,并返回特定的错误码
ipip # 用于实现IP隧道功能的模块,使得数据可以在两个网络之间进行传输
查看已写入加载的模块
2. 配置 k8s 内核
[root@k8s-master ~]# vim /etc/sysctl.d/k8s.conf
# 写入k8s所需内核模块
# net.bridge.bridge-nf-call-iptables = 1 # 控制网络桥接与iptables之间的网络转发行为
# net.bridge.bridge-nf-call-ip6tables = 1 # 用于控制网络桥接(bridge)的IP6tables过滤规则。当该参数设置为1时,表示启用对网络桥接的IP6tables过滤规则
# fs.may_detach_mounts = 1 # 用于控制文件系统是否允许分离挂载,1表示允许
# net.ipv4.conf.all.route_localnet = 1 # 允许本地网络上的路由。设置为1表示允许,设置为0表示禁止。
# vm.overcommit_memory=1 # 控制内存分配策略。设置为1表示允许内存过量分配,设置为0表示不允许。
# vm.panic_on_oom=0 # 决定当系统遇到内存不足(OOM)时是否产生panic。设置为0表示不产生panic,设置为1表示产生panic。
# fs.inotify.max_user_watches=89100 # inotify可以监视的文件和目录的最大数量。
# fs.file-max=52706963 # 系统级别的文件描述符的最大数量。
# fs.nr_open=52706963 # 单个进程可以打开的文件描述符的最大数量。
# net.netfilter.nf_conntrack_max=2310720 # 网络连接跟踪表的最大大小。
# net.ipv4.tcp_keepalive_time = 600 # TCP保活机制发送探测包的间隔时间(秒)。
# net.ipv4.tcp_keepalive_probes = 3 # TCP保活机制发送探测包的最大次数。
# net.ipv4.tcp_keepalive_intvl =15 # TCP保活机制在发送下一个探测包之前等待响应的时间(秒)。
# net.ipv4.tcp_max_tw_buckets = 36000 # TCP TIME_WAIT状态的bucket数量。
# net.ipv4.tcp_tw_reuse = 1 # 允许重用TIME_WAIT套接字。设置为1表示允许,设置为0表示不允许。
# net.ipv4.tcp_max_orphans = 327680 # 系统中最大的孤套接字数量。
# net.ipv4.tcp_orphan_retries = 3 # 系统尝试重新分配孤套接字的次数。
# net.ipv4.tcp_syncookies = 1 # 用于防止SYN洪水攻击。设置为1表示启用SYN cookies,设置为0表示禁用。
# net.ipv4.tcp_max_syn_backlog = 16384 # SYN连接请求队列的最大长度。
# net.ipv4.ip_conntrack_max = 65536 # IP连接跟踪表的最大大小。
# net.ipv4.tcp_max_syn_backlog = 16384 # 系统中最大的监听队列的长度。
# net.ipv4.tcp_timestamps = 0 # 用于关闭TCP时间戳选项。
# net.core.somaxconn = 16384 # 用于设置系统中最大的监听队列的长度