img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

第一课:k8s介绍安装

tags:

  • golang
  • 2019尚硅谷

categories:

  • K8s
文章目录

第一节 K8s发展流程

1.1 相关概念
  1. Infrastructure as a Service 基础设置及服务例:阿里云
  2. platform as a service 平台及服务例:新浪云
  3. Software as a Service 软件及服务例:Office 365
1.2 K8s发展历史
  1. Apache的MESOS作为一款分布式资源管理框架最先出世。 但是2019年twiter弃用MESOS,改用K8s(和我们底层相融非常简单)
  2. docker swarm. docker的母公司的产品(非常轻量级几十兆,但是实现的功能非常少)。虽然在大型环境下也可以用(效果也好),但是一般公司不会浪费人力使用它。
  3. kubernetes功能全面,稳定适合公司运行。(成为公司的最佳选择方案),它的靠山是谷歌。作为谷歌10年容器化基础架构中有一个组件叫做borg,非常受欢迎。后来谷歌用Go语言重写了borg组件成为我们的kubernetes。
1.3 K8s特点
  1. 轻量级。消耗的资源小
  2. 开源
  3. 弹性伸缩
  4. 负载均衡:IPVS
1.4 课程架构(需要掌握程度)

适合人群: 软件工程师 测试工程师 运维工程师 软件架构师项目经理
服务分类

  • 有状态服务: DBMS (数据库管理系统)
  • 无状态服务: LVS APACHE docker更适用于它,但是K8s的目标是有状态服务
  1. 介绍说明: 前世令生 KUbernetes框架 KUbernetes关键字含义
  2. 基础概念: 什么是Pod 控制器类型K8S 网络通讯模式
  3. Kubernetes: 构建K8S集群
  4. 资源清单: 资源掌握资源清单的语法 编写Pod 掌握Pod的生命周期**(这一章是重难点)**
  5. Pod控制器: 掌握各种控制器的特点以及使用定义方式
  6. 服务发现:掌握SVC原理及基构建方式
  7. 存储: 掌握多种存储类型的特点并且能够在不同环境中选择合适的存储方案(要有自己的见解)
  8. 调度器: 掌握调度器原理能够 根据要求把Pod定义到想要的节点运行
  9. 安全:集群的认证 鉴权 访问控制原理及其流程
  10. 运维初试: 修改Kubeadm达到证书可用期限为10年 能够构建高可用的Kubernetes集群

第二节 K8s架构组件

2.1 borg 组件说明
  1. borg 组件架构图如下。
    在这里插入图片描述
  2. Paxos 是谷歌键值对的数据库
  3. BorgMaster主要负责请求的分发。它的副本最好是三个以上的奇数(防单节点故障,而且不会出现,防止出现2票斗两票的情况)
  4. Borglet是真正工作的节点
  5. scheduler(调度器): 任务把数据写到Paxos数据库存储。Borglet会不停的监听Paxos数据库。如果有自己的任务就处理。
2.2 k8s说明
  1. k8s 架构图
    在这里插入图片描述
  2. node 是执行者。上面是领导者。
  3. 领导者中的scheduler。同样负责请求的分发,它把请求给api server,然后api server把它存入到etcd数据库。
  4. 领导者中的(replication controller)用来维护我们的副本数目,也就是期望值的。
  5. kubetcl 是我们的命令行管理工具。
  6. 图中可以看到几乎所有的组件都需要根api server交互,他还是比较繁忙的,后期可以申请一定的缓存。
  7. etcd 用GO语言编写 采用http协议 进行c/s构建的服务
    • etcd的官方将它定位成一个可信赖(天生支持集群化)的分布式键值存储服务,它能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转
    • 推荐在Kubernetes 集群中使用Etcd v3,v2版本已在Kubernetes v1. 11中弃用
    • v2 会把数据全部写入到内存中,v3会持久化到硬盘上。
    • 如果你是用的是比较古老的k8s,需要手动把etcd进行备份。
    • Raft 读写的信息存在这里
    • WAL 预写日志。如果需要对Raft数据进行修改时,先完整备份在增量备份。
    • 它还会实时写入到本地磁盘上Store
      在这里插入图片描述
  8. 那么一个执行者节点中,至少应该用kubelet kube proxy docker(或其他的容器引擎)三个软件
  9. 执行者节点中kubelet会和我们CRI(容器container,运行环境runtime,接口Interface ), 它会与docker交互,操作docker创建对应的容器。维持pod的生命周期
  10. 执行者节点中kube proxy实现pod和pod之间的访问,包括负载均衡。默认操作我们的防火墙去操作我们pod的映射。新版本中还支持IPVS,也就是IVS组件
2.3 k8s组件总结
  1. 主要组件

    • APISERVER:所有服务访问统一入口
    • CrontrollerManager:维持副本期望数目
    • Scheduler: 负责介绍任务,选择合适的节点进行分配任务
    • ETCD: 键值对数据库 储存K8S集群所有重要信息(持久化)
    • Kubelet:直接跟容器引擎交互实现容器的生命周期管理
    • Kube-proxy:负责写入规则至IPTABLES、 IPVS 实现服务映射访问的
  2. 部分重要插件

    • COREDNS: 可以为集群中的SVC创建一个域名IP的对应关系解析
    • DASHBOARD: 给K8S集群提供一个B/S结构访问体系
    • INGRESS CONTROLLER: 官方只能实现四层代理,INGRESS 可以实现七层代理
    • FEDERATION: 提供一 个可以跨集群中心多K8S统一管理功能
    • PROMETHEUS: 提供K8S集群的监控能力
    • ELK: 提供K8S集群日志统分析接入平台

第三节 K8s基础概念

3.1 pod的概念

在这里插入图片描述

  1. 自主式Pod(不是控制器控制的pod, 死了没人拉起来)
  2. 控制器管理的Pod
    • ReplicationController(RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收。在新版本的Kubernetes 中建议使用RepliicaSet来取代ReplicationControlle
    • **ReplicaSet(RS)**跟ReplicationController没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector
    • 虽然ReplicaSet 可以独立使用,但一般还是建议使用Deployment 来自动管理ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet不支持rolling update但Deployment 支持)。
    • Horizontal Pod Autoscaling(HA)仅适用于Deployment 和ReplicaSet ,在V1版本中仅支持根据Pod的CPU利用率扩所容,在vlalpha 版本中,支持根据内存和用户自定义的metric扩缩容
    • StatefulSet是为了解决有状态服务的问题(对应Deployments 和Repl icaSets是为无状态服务而设计),其应用场景包括:
      • *稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
      • *稳定的网络标志,即Pod重新调度后其PodName 和HostName 不变,基于Headless Service(即没有Cluster IP的Service )来实现
      • *有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running 和Ready状态),基于init containers来实现
      • *有序收缩,有序删除(即从N-1到0)
    • DaemonSet确保全部(或者一些) Node上运行一个Pod的副本。当有Node加入集群时,也会为他们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet 将会删除它创建的所有Pod。使用DaemonSet的–些典型用法:
      • *运行集群存储daemon, 例如在每个Node. 上运行glusterd、 ceph.
      • *在每个Node 上运行日志收集daemon, 例如f luentd、 logstash。
      • *在每个Node上运行监控daemon, 例如Prometheus Node Exporter
    • Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一一个或多个Pod成功结束Cron Job管理基于时间的 Job,即:
      • 在给定时间点只运行一次
      • 周期性地在给定时间点运行
        在这里插入图片描述
3.2 网络通讯方式
  1. Kubernetes的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中,这在GCE (Google Compute Engine)里面是现成的网络模型,Kubernetes 假定这个网络已经存在。而在私有云里搭建Kubernetes 集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不同节点上的Docker 容器之间的互相访问先打通,然后运行Kubernetes。
    • 同一个Pod内的多个容器之间: lo
    • 各Pod之间的通讯: Overlay Network
    • Pod与Service 之间的通讯:各节点的Iptables 规则
  2. Flannel是CoreOS 团队针对Kubernetes 设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP 地址之间建立一个覆盖网络(Overlay Network) ,通过这个覆盖网络,将数据包原封不动地传递到目标容器内
    • ETCD之Flannel 提供说明:
      • 存储管理Flannel 可分配的IP地址段资源
      • 监控ETCD中每个Pod 的实际地址,并在内存中建立维护Pod 节点路由表

在这里插入图片描述
3. 同一个Pod内部通讯:同- 一个Pod共享同一个网络命名空间,共享同一个Linux 协议栈
4. Pod1至Pod2

  • Pod1 与Pod2不在同一台主机,Pod的地址是与docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP网段,并且环同Node之间的通信只能通过宿主机的物理网卡进行。将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问
  • Pod1 与Pod2在同一台机器,由Docker0 网桥直接转发请求至Pod2, 不需要经过Flannel
  1. Pod至Service 的网络:
    • 目前基于性能考虑,全部为iptables维护和转发Pod到外网:
    • Pod 向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后,iptables执行Masquerade,把源IP更改为宿主网卡的IP,然后向外网服务器发送请求
    • 外网访问Pod: Service
  2. 只有节点网络是真实网络(只需一张网卡就可实现)
    在这里插入图片描述

第四节 环境的基本安装

4.1 虚拟机中系统环境初始化
  1. 新建虚拟机 安装k8s的节点必须是大于1核心的CPU 内存2G
    • k8s-master仅主机模式(192.168.66.10)
    • k8s-node1仅主机模式(192.168.66.20)
    • k8s-node2仅主机模式(192.168.66.21)
  2. 对上面虚拟机分别配置网络,打开文件vi /etc/sysconfig/network-scripts/ifcfg-ens33,配置网络。重启网络:systemctl restart network。
    IPADDR=192.168.66.10
    NETMASK=255.255.255.0
    GATEWAY=192.168.66.133
    DNS1=192.168.66.1
    DNS2=114.114.114.114 

# 设置主机名
hostnamectl set-hostname k8s-master
# 让每台机子可以相互解析 在添加
vi /etc/hosts
192.168.66.10 k8s-master
192.168.66.20 k8s-node1
192.168.66.21 k8s-node2
192.168.66.100 hub.qnhyn.com
# hosts复制到别的虚拟机
scp /etc/hosts root@k8s-node2:/etc/hosts

# 安装依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
# 关闭防火墙
swapoff -a && sed -i '/ swap / s/^\(.\*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.\*/SELINUX=disabled/' /etc/selinux/config

# 调整内核参数,对于K8S
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip\_forward=1
net.ipv4.ip\_nonlocal\_bind = 1
net.ipv4.tcp\_tw\_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit\_memory=1 # 不检查物理内存是否够用
vm.panic\_on\_oom=0 # 开启 OOM
fs.inotify.max\_user\_instances=8192
fs.inotify.max\_user\_watches=1048576
fs.file-max=52706963
fs.nr\_open=52706963
net.ipv6.conf.all.disable\_ipv6=1
net.netfilter.nf\_conntrack\_max=2310720
EOF

sysctl -p /etc/sysctl.d/kubernetes.conf

# 调整系统时区
#设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai 
#将当前的 UTC 时间写入硬件时钟 
timedatectl set-local-rtc 0
#重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
# 关闭不需要的服务
systemctl stop postfix && systemctl disable postfix

# 设置 rsyslogd 和 systemd journald
#创建持久化保存日志的目录
mkdir /var/log/journal
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
#持久化保存到磁盘
Storage=persistent
#压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
#最大占用空间 10G 
SystemMaxUse=10G
#单日志文件最大 200M
SystemMaxFileSize=200M
#日志保存时间 2 周
MaxRetentionSec=2week
#不将日志转发到 syslog
ForwardToSyslog=no
EOF

systemctl restart systemd-journald

# 升级系统内核为 4.44(可选)
# CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,查看内核命令uname -r,升级步骤如下:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
#设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86\_64) 7 (Core)"
# 重启后产看内核变化啦
reboot
uname -r
sudo setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 关闭防火墙和ipttables 如果不设置后面加入节点可能有问题如:couldn't validate the identity of the API Server
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF
sudo sysctl --system

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

4.2 虚拟机Kubeadm部署安装
  1. kube-proxy开启ipvs的前置条件
# 由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip\_vs
modprobe -- ip\_vs\_rr
modprobe -- ip\_vs\_wrr
modprobe -- ip\_vs\_sh
modprobe -- nf\_conntrack\_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 脚本创建了的/etc/sysconfig/modules/ipvs.modules文件, 保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip\_vs -e nf\_conntrack\_ipv4命令查看是否已经正确加载所需的内核模块。

  1. 安装docker软件
# 安装依赖库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 导入阿里云的镜像仓库
sudo yum-config-manager \
      --add-repo \
      http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 下载安装docker
yum update -y && yum install -y docker-ce
# 创建/etc/docker目录
mkdir /etc/docker
# 设置一下daemon中cgroup为syetemd 默认有两个cgroup 存储文件格式为json-flle,大小为100Mb
cat > /etc/docker/daemon.json <<EOF
{
 "exec-opts": ["native.cgroupdriver=systemd"],
 "log-driver": "json-file",
 "log-opts": {
 "max-size": "100m"
 }
}
EOF
# 创建目录存放docker配置文件
mkdir -p /etc/systemd/system/docker.service.d
#重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

第五节 环境的基本安装

5.1安装Kubeadm


![img](https://img-blog.csdnimg.cn/img_convert/3558eef3f42c4089fcaf2a27c3203636.png)
![img](https://img-blog.csdnimg.cn/img_convert/e413b30aaa0534cce1eaf8cfb565adbc.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

stemctl enable docker

第五节 环境的基本安装

5.1安装Kubeadm


[外链图片转存中...(img-MreF3fIN-1715503931901)]
[外链图片转存中...(img-smufoSt6-1715503931902)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐