1. 实验环境
1 四组基本概念
- Pod/Pod控制器
- Name/Namespace
- Lable/Label选择器
- Service/Ingress
1.1 POD和POD控制器
-
Pod
k8s里能够被运行的最小逻辑单元
1个POD里面可以运行多个容器(SideCar 边车模式)
POD中的容器共享 UTS/NAT/IPC 名称空间
POD和容器颗粒理解为豌豆荚和豌豆 -
Pod控制器
Pod控制器是Pod启动的一种模板
用来保证在K8S里启动的Pod始终按预期运行
包括副本数\生命周期\健康检查等 -
常用的Pod控制器:
控 度器名称 用途简述 Deployment 用于管理无状态应用,支持滚动更新和回滚 DaemonSet 确保集群中的每一个节点上只运行一个特定的pod副本 ReplicaSet 确保pod副本数量符合用户期望的数量状态 StatefulSet 管理有状态应用 Job 有状态,一次性任务 Cronjob(定时任务) 有状态,周期性任务
1.2 Name/Namespace
-
Name
K8S使用'资源'来定义每一种逻辑概念(功能)
每种'资源'都应该有自己的'名称''名称'通常定义在'资源'的元数据(metadata)信息中资源的配置信息包括
- API版本(apiVersion)
- 类别(kind)
- 元数据(metadata)
- 定义清单(spec)
- 状态(status)
-
Namespace
名称空间用于隔离K8S内各种资源,类似K8S内部的虚拟分组
同一个名称空间中,相同资源的名称不能相同
默认的名称空间为default
,kube-system
,kube-public
查询特定资源,要带上相应的名称空间
1.3 Lable/Label选择器
- Lable
标签的作用是便于分类管理资源对象
标签与资源之间是多对多的关系
给一个资源多个标签,可以实现不同维度的管理 - Lable选择器
可以使用标签选择器过滤指定的标签
标签选择器有基于等值关系(等于,不等于)和基于集合关系(属于,存在)的两种
许多资源都支持内嵌标签选择器字段:matchLables
或matchExpressions
1.4 Service/Ingress
- Service(重点)
POD会分配IP地址,但IP会随着POD销毁而消失
多个同类型POD,IP或端口必然不同,但却相同的服务
Service用来提供相同服务POD的对外访问接口
Service通过标签选择器来确定作用于哪些POD
Service只能提供L4层的调度,即:IP+端口 - Ingress(重点)
Igress也是用来暴露POD的对外访问接口
Igress提供L7层的调度,即http/https
Igress可以调度不同业务域,不同URL路径的流量
2 核心组件与核心附件
-
核心组件
配置存储中心- etcd服务
主控节点(master)
- kube-apiserver服务
- kube-controller-manager服务
- kube-scheduler服务
运算节点(node)
- kube-kubelet服务
- kube-proxy服务
-
CLI客户端
kubectl命令行工具 -
核心附件
CNI网络插件(flannel/calico)
服务发现插件(coredns)
服务暴露插件(traefik)
GUI管理插件(daahboard)
2.1 核心组件功能
- 配置存储中心-etcd
etcd是一个非关系型数据库,作用类似于zookeeper注册中心
用于各种服务的注册和数据缓存 - kube-apiserver(master)
提供季军管理的REST API接口,包括鉴权、数据校验、集群状态变更
负责其他模块之间的数据交互,承担通信枢纽的功能
和etcd通信,是资源配额控制的入口
提供玩备的集群控制机制 - kube-controller-manager
由一系列控制器组成,通过apiserver监控整个集群的状态,确保集群处于预期的工作状态
是管理所有控制器的控制器 - kube-scheduler
主要是接收调度POD到合适的node节点上
通过apiserver,从etcd中获取资源信息进行调度
只负责调度工作,启动工作是node节点上的kubelet负责
调度策略:预算策略(predict)、优选策略(priorities) - kube-kubelet
定时从apiserver获取节点上POD的期望状态(如副本数量、网络类型、存储空间、容器类型等)然后调用容器平台接口达到这个状态
提供POD节点具体使用的网络
定时汇报当前节点状态给apiserver,以供调度
复制镜像和容器的创建和清理工作 - kube-proxy
是K8S在每个节点上运行网络的代理,service资源的载体
不直接为POD节点提供网络,而是提供POD间的集群网络
建立了POD网络和集群网络的关系(clusterIp->podIp)
负责建立、删除、更新调度规则
与apiserver通信,以更新自己和获取其他kube-proxy的的调度规则
常用的调度模式:Iptables(不推荐)、Ipvs(推荐)
2.2 K8S的三条网络
- 节点网络
实际网络,就是宿主机网络
建议地址段:10.4.7.0/24
建议通过不同的IP端,区分不同的业务、机房或数据中心 - Pod 网络
实际网络,容器运行的网络
建议172.7.21.0/24
,并建议POD网段与节点IP绑定
如: 节点IP为10.4.7.21
,则POD网络为172.7.21.0/24
- service网络
虚拟网络,也叫集群网络(cluster server),用于内部集群间通信
构建于POD网络之上, 主要是解决服务发现和负载均衡
通过kube-proxy连接POD网络和service网络
建议地址段为:192.168.0.0/16
3 K8S流程图
说明:
主控节点和node节点只是逻辑上的概念,物理上可以部署在一起
2.安装前准备
2.1. 环境准备
所有机器执行
[root@hdss7-11 ~]# systemctl stop firewalld
[root@hdss7-11 ~]# systemctl disable firewalld
[root@hdss7-11 ~]# setenforce 0
[root@hdss7-11 ~]# sed -ir '/^SELINUX=/s/=.+/=disabled/' /etc/selinux/config
[root@hdss7-11 ~]# yum install -y epel-release
[root@hdss7-11 ~]# yum install -y wget net-tools telnet tree nmap sysstat lrzsz dos2unix bind-utils vim less
2.2 bind 安装
2.2.1 hdss7-11 安装bind
[root@hdss7-11 ~]# yum install bind -y
2.2.2 hdss7-11 修改bind
[root@hdss7-11 ~]vim /etc/named.conf
listen-on port 53 { 10.4.7.11; };
allow-query { any; };
forwarders { 10.4.7.11; }; # 自己添加
recursion yes;
dnssec-enable no;
dnssec-validation no;
2.2.3 使用named-checkconf进行检查
named-checkconf
2.2.4 在 hdss7-11.host.com 配置区域文件
# 增加两个zone配置,od.com为业务域,host.com.zone为主机域
[root@hdss7-11 ~] vim /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; };
};
2.2.5 在 hdss7-11.host.com 配置主机域文件
vim /var/named/hosts.com.zone
# line6中时间需要修改
[root@hdss7-11 ~]# vim /var/named/host.com.zone
$ORIGIN host.com.
$TTL 600 ; 10 minutes
@ IN SOA dns.host.com. dnsadmin.host.com. (
2020070601 ; 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
2.2.6 在 hdss7-11.host.com 配置业务域文件
[root@hdss7-11 ~]# vim /var/named/od.com.zone
$ORIGIN od.com.
$TTL 600 ; 10 minutes
@ IN SOA dns.od.com. dnsadmin.od.com. (
2020070601 ; 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
named-checkzone od.com /var/named/od.com.zone
named-checkzone host.com /var/named/host.com.zone # 使用named-checkzone 进行检查
2.2.6启动named
systemctl start named
dig -t A hdss7-21.host.com @10.4.7.11 +short
使用dig解析看是否是10.4.7.11
2.2.7.修改主机DNS修改所有主机的dns服务器地址
[root@hdss7-11 ~]# sed -i '/DNS1/s/10.4.7.254/10.4.7.11/' /etc/sysconfig/network-scripts/ifcfg-eth0
[root@hdss7-11 ~]# systemctl restart network
[root@hdss7-11 ~]# cat /etc/resolv.conf
Generated by NetworkManager
search host.com
nameserver 10.4.7.11
# 使用ping hdss7-200 进行测试
[root@hdss7-11 ~]# ping hdss7-200
PING HDSS7-200.host.com (10.4.7.200) 56(84) bytes of data.
64 bytes from 10.4.7.200 (10.4.7.200): icmp_seq=1 ttl=64 time=0.738 ms
64 bytes from 10.4.7.200 (10.4.7.200): icmp_seq=2 ttl=64 time=2.16 ms
64 bytes from 10.4.7.200 (10.4.7.200): icmp_seq=3 ttl=64 time=1.81 ms
2.2.8本次实验环境使用的是虚拟机,因此也要对windows宿主机NAT网卡DNS进行修改
2.3 根证书准备
在 hdss7-200 下载工具
[root@hdss7-200 ~]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
[root@hdss7-200 ~]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssl-json
[root@hdss7-200 ~]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
[root@hdss7-200 ~]# chmod u+x /usr/local/bin/cfssl*
在 hdss7-200 签发根证书
[root@hdss7-200 ~]# mkdir /opt/certs/ ; cd /opt/certs/
# 根证书配置:
# CN 一般写域名,浏览器会校验
# names 为地区和公司信息
# expiry 为过期时间
[root@hdss7-200 certs]# vim /opt/certs/ca-csr.json
{
"CN": "OldboyEdu",
"hosts": [
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "beijing",
"L": "beijing",
"O": "od",
"OU": "ops"
}
],
"ca": {
"expiry": "175200h"
}
}
# 签发证书
[root@hdss7-200 certs]# cfssl gencert -initca ca-csr.json | cfssl-json -bare ca
# 查看签发的证书
[root@hdss7-200 certs]# ll certs *
ls: cannot access certs: No such file or directory
-rw-r--r-- 1 root root 993 Jul 7 10:31 ca.csr
-rw-r--r-- 1 root root 328 Jul 7 10:25 ca-csr.json
-rw------- 1 root root 1675 Jul 7 10:31 ca-key.pem
-rw-r--r-- 1 root root 1346 Jul 7 10:31 ca.pem
2.4 docker 环境准备
docker的机器 在 hdss7-21 hdss7-22 hdss7-200 机器上操作以hdss7-21 为例
[root@hdss7-21 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@hdss7-21 ~]# yum install -y docker-ce
[root@hdss7-21 ~]# mkdir /etc/docker/
# 不安全的registry中增加了harbor地址
# 各个机器上bip网段不一致,bip中间两段与宿主机最后两段相同,目的是方便定位问题
[root@hdss7-21 ~]# vim /etc/docker/daemon.json
{
"graph": "/data/docker",
"storage-driver": "overlay2",
"insecure-registries": ["registry.access.redhat.com","quay.io","harbor.od.com"],
"registry-mirrors": ["https://registry.docker-cn.com"],
"bip": "172.7.21.1/24",
"exec-opts": ["native.cgroupdriver=systemd"],
"live-restore": true
}
[root@hdss7-21 ~]# mkdir /data/docker
[root@hdss7-21 ~]# systemctl start docker ; systemctl enable docker
# 注意 操作hass7-22 与hdss7-200 将bip改为 172.7.21.22/24 172.7.21.200/24