前言:如果你是新手,机器的名字及各种账户密码一定要和我的一样,先学一遍,再自己改
WHAT :用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制
WHY :为什么使用它,因为它是管理docker容器最主流的编排工具
- Pod
- Pod是K8S里能够被运行的最小的逻辑单元(原子单元)
- 1个Pod里面可以运行多个容器,它们共享UTS+NET+IPC名称空间
- 可以把Pod理解成豌豆荚,而同一Pod内的每个容器是一颗颗豌豆
- 一个Pod里运行多个容器,又叫边车(SideCar)模式
- Pod控制器(关于更多 初识Pod )
- Pod控制器是Pod启动的一种模板,用来保证在K8S里启动的Pod始终按照人们的预期运行(副本数、生命周期、健康状态检查...)
- Pod内提供了众多的Pod控制器,常用的有以下几种:
- Deployment
- DaemonSet
- ReplicaSet
- StatefulSet
- Job
- Cronjob
- Name
- 由于K8S内部,使用“资源”来定义每一种逻辑概念(功能),故每种“资源”,都应该有自己的“名称”
- “资源”有API版本(apiVersion)类别(kind)、元数据(metadata)、定义清单(spec)、状态(status)等配置信息
- “名称”通常定义在“资源”的“元数据”信息里
- namespace
- 随着项目增多、人员增加、集群规模的扩大,需要一种能够隔离K8S内各种“资源”的方法,这就是名称空间
- 名称空间可以理解尾K8S内部的虚拟集群组
- 不同名称空间内的“资源”名称可以相同,相同名称空间内的同种“资源”、“名称”不能相同
- 合理的使用K8S名称空间,使得集群管理员能够更好的对交付到K8S里的服务进行分类管理和浏览
- K8S内默认存在的名称空间有:default、kube-system、kube-public
- 查询K8S里特定“资源”要带上想应得名称空间
- Label
- 标签是K8S特色的管理方式,便于分类管理资源对象
- 一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多对多的关系
- 一个资源拥有多个标签,可以实现不同维度的管理
- 标签的组成:key=value
- 与标签类似的,还有一种“注解”(annotations)
- Label选择器
- 给资源打上标签后,可以使用标签选择器过滤指定的标签
- 标签选择器目前有两个:基于等值关系(等于、不等于)和基于集合关系(属于、不属于、存在)
- 许多资源支持内嵌标签选择器字段
- matchLabels
- matchExpressions
- Service
- 在K8S的世界里,虽然每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失
- Service(服务)就是用来解决这个问题的核心概念
- 一个Service可以看作一组提供相同服务的Pod的对外访问接口
- Service作用与哪些Pod是通过标签选择器来定义的
- Ingress
- Ingress是K8S集群里工作在OSI网络参考模型下,第7层的应用,对外暴露的接口
- Service只能进行L4流量调度,表现形式是ip+port
- Ingress则可以调度不同业务域、不同URL访问路径的业务流量
简单理解:Pod可运行的原子,name定义名字,namespace名称空间(放一堆名字),label标签(另外的名字),service提供服务,ingress通信
K8S架构图(并非传统意义上的PaaS服务,而是IaaS服务)
- kubectl :Kubernetes集群的命令行接口
- API Server :的核心功能是对核心对象(例如:Pod,Service,RC)的增删改查操作,同时也是集群内模块之间数据交换的枢纽
- Etcd :包含在 APIServer 中,用来存储资源信息
- Controller Manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
- Scheduler :负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上。可以通过这些有更深的了解:
- kube-proxy :负责为Service提供cluster内部的服务发现和负载均衡
- Kubelet :在Kubernetes中,应用容器彼此是隔离的,并且与运行其的主机也是隔离的,这是对应用进行独立解耦管理的关键点。 kubelet工作原理解析
- Node :运行容器应用,由Master管理
我们部署的K8S架构图
可以简单理解成:
- 11机器:反向代理
- 12机器:反向代理
- 21机器:主控+运算节点(即服务群都是跑在21和22上)
- 22机器:主控+运算节点(生产上我们会把主控和运算分开)
- 200机器:运维主机(放各种文件资源)
这样控节点有两个,运算节点有两个,就是小型的分布式,现在你可能没办法理解这些内容,我们接着做下去,慢慢的,你就理解了
实验机器安装详解
准备一台8C64G的机器,我们将它分成5个节点,如下图
整体 | 11机器 | 12机器 | 21机器 | 22机器 | 200机器 | |
---|---|---|---|---|---|---|
低配 | 4C32G | 2C2G | 2C2G | 2C8G | 2C8G | 2C2G |
标配 | 8C64G | 2C4G | 2C4G | 2C16G | 2C16G | 2C2G |
如果你的电脑是4C16G的(一般笔记本都有的),你可以先用你的电脑尝试做这个PaaS服务,做到Jenkins的时候就已经很卡了,到时候你再买服务器也比较省钱,前期我还是希望各位能在理解上花些时间,慢慢的操作,否则报错都不知道怎么解决
关于怎么制作虚拟机并连接NAT网并连接shell
设置NAT(这样才可以直接在电脑浏览器访问到),如图:
使用我的镜像包或者任意7.6以上版本的CentOS(这个工具是VMware Workstation Pro)
7.6镜像网上资源少,这里提供一个:https://pan.baidu.com/s/1mkIzua1XQmew240XBbvuFA 提取码:7p6h 。注意:镜像包的network是ens33,我用的是eth0,下面你就知道在哪用了,你也可以改成跟我一样,这是百度经验https://jingyan.baidu.com/article/17bd8e524c76a285ab2bb8ff.html
位置自己存放在一个比较大的位置,我是放在了G盘
连接进去后,到Linux安装页面(可以查网上的),安装minimal设置好root即可。然后再打开,此时ping是ping不通的,不需要管。右键模板机->管理->克隆->下一步->下一步(虚拟机当前状态)->下一步(创建链接克隆)下一步->完成(改好)
开启此虚拟机,我创建了5台机器了(用的自己电脑4C16G)
# 全部机器,设置名字,11是hdss7-11,12是hdss7-12,以此类推
~]# hostnamectl set-hostname hdss7-11.host.com
~]# exit
# 下面的修改,11机器对应11,12对应12,以此类推
~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
...修改如下图
~]# systemctl restart network
~]# ping baidu.com
ifcfg-eth0 :有些人的机器可能是ifcfg-esn33,自己注意即可
systemctl restart :重启某个服务
ping :用于测试网络连接量的程序
也有这种的。(贡献者:https://github.com/d00522)DNS 配置成254不行就重启机器, 配成8.8.8.8或114.114.114.114。
然后在xshell访问id即可,如图
xshell下载 当然我也有提供软件包:https://pan.baidu.com/s/1mkIzua1XQmew240XBbvuFA 提取码:7p6h 。里面还有Xftp,是用来进行本地电脑和虚拟机的文件传输
# 查看enforce是否关闭,确保disabled状态,当然可能没有这个命令
~]# getforce
# 查看内核版本,确保在3.8以上版本
~]# uname -a
# 关闭firewalld
~]# systemctl stop firewalld
# 安装epel源及相关工具
~]# yum install epel-release -y
~]# yum install wget net-tools telnet tree nmap sysstat lrzsz dos2unix bind-utils -y
uname :显示系统信息
- -a/-all :显示全部
yum :提供了查找、安装、删除某一个、一组甚至全部软件包的命令
- install :安装
- -y :当安装过程提示选择全部为"yes"
bind9安装部署(DNS服务)
WHAT :DNS(域名系统)说白了,就是把一个域和IP地址做了一下绑定,如你在里机器里面输入 nslookup www.qq.com,出来的Address是一堆IP,IP是不容易记的,所以DNS让IP和域名做一下绑定,这样你输入域名就可以了
WHY :我们要用ingress,在K8S里要做7层调度,而且无论如何都要用域名(如之前的那个百度页面的域名,那个是host的方式),但是问题是我们怎么给K8S里的容器绑host,所以我们必须做一个DNS,然后容器服从我们的DNS解析调度
# 在11机器:
~]# yum install bind -y
~]# rpm -qa bind
# out: bind-9.11.4-9.P2.el7.x86_64
# 配置主配置文件,11机器
~]# vi /etc/named.conf
listen-on port 53 { 10.4.7.11; }; # 原本是127.0.0.1
# listen-on-v6 port 53 { ::1; }; # 需要删掉
allow-query { any; }; # 原本是locall
forwarders { 10.4.7.254; }; #另外添加的
dnssec-enable no; # 原本是yes
dnssec-validation no; # 原本是yes
# 检查修改情况,没有报错即可(即没有信息)
~]# named-checkconf
rpm :软件包管理器
- -qa :查看已安装的所有软件包
rpm和yum安装的区别 :前者不检查相依性问题,后者检查(即相关依赖包)
named.conf文件内容解析:
- listen-on :监听端口,改为监听在内网,这样其它机器也可以用
- allow-query :哪些客户端能通过自建的DNS查
- forwarders :上级DNS是什么
# 11机器,经验:主机域一定得跟业务是一点关系都没有,如host.com,而业务用的是od.com,因为业务随时可能变
# 区域配置文件,加在最下面
~]# vi /etc/named.rfc1912.zones
zone "host.com" IN {
type master;
file "host.com.zone";
allow-update { 10.4.7.11; };
};
zone "od.com" IN {
type master;
file "od.com.zone";
allow-update { 10.4.7.11; };
};
注意: 当配置10.4.7.11后,该机器应保存运行状态,重启后其它机器可能无法连接外网。@https://github.com/xinzhuxiansheng感谢建议!
# 11机器:
# 注意serial行的时间,代表今天的时间+第一条记录:20200112+01
7-11 ~]# vi /var/named/host.com.zone
$ORIGIN host.com.
$TTL 600 ; 10 minutes
@ IN SOA dns.host.com. dnsadmin.host.com. (
2020011201 ; serial
10800 ; refresh (3 hours)
900 ; retry (15 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
NS dns.host.com.
$TTL 60 ; 1 minute
dns A 10.4.7.11
HDSS7-11 A 10.4.7.11
HDSS7-12 A 10.4.7.12
HDSS7-21 A 10.4.7.21
HDSS7-22 A 10.4.7.22
HDSS7-200 A 10.4.7.200
7-11 ~]# vi /var/named/od.com.zone
$ORIGIN od.com.
$TTL 600 ; 10 minutes
@ IN SOA dns.od.com. dnsadmin.od.com. (
2020011201 ; serial
10800 ; refresh (3 hours)
900 ; retry (15 minutes)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
NS dns.od.com.
$TTL 60 ; 1 minute
dns A 10.4.7.11
# 看一下有没有报错
7-11 ~]# named-checkconf
7-11 ~]# systemctl start named
7-11 ~]# netstat -luntp|grep 53
TTL 600 :指定IP包被路由器丢弃之前允许通过的最大网段数量
- 10 minutes :过期时间10分钟
SOA :一个域权威记录的相关信息,后面有5组参数分别设定了该域相关部分
- dnsadmin.od.com. 一个假的邮箱
- serial :记录的时间
$ORIGIN :即下列的域名自动补充od.com,如dns,外面看来是dns.od.com
netstat -luntp :显示 tcp,udp 的端口和进程等相关情况
# 11机器,检查主机域是否解析
7-11 ~]# dig -t A hdss7-21.host.com @10.4.7.11 +short
# 配置linux客户端和win客户端都能使用这个服务,修改
7-11 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DNS1=10.4.7.11
7-11 ~]# systemctl restart network
7-11 ~]# ping www.baidu.com
7-11 ~]# ping hdss7-21.host.com
dig -t A :指的是找DNS里标记为A的相关记录,而后面会带上相关的域,如上面的hdss7-21.host.com,为什么外面配了HDSS7-21后面还会自动接上.host.com就是因为$ORIGIN,后面则是对应的IP
- +short :表示只返回IP
# 在所有机器添加search... ,即可使用短域名(我的是自带的)
~]# vi /etc/resolv.conf
~]# ping hdss7-200
# 在非11机器上,全部改成11
~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DNS1=10.4.7.11
~]# systemctl restart network
# 试下网络是否正常
~]# ping baidu.com
# 其它机器尝试ping7-11机器
7-12 ~]# ping hdss7-11.host.com
让其它机器的DNS全部改成11机器的好处是,全部的机器访问外网就只有通过11端口,更好控制
修改window网络,并ping
ping不了的,修改以下配置
下一节:证书,可以用来审计也可以保障安全,k8S组件启动的时候,则需要有对应的证书。