K8S前置准备工作

前言:如果你是新手,机器的名字及各种账户密码一定要和我的一样,先学一遍,再自己改

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组件启动的时候,则需要有对应的证书。