K8S-day01
2. Kubernetes概述
官网:
https://kubernetes.io/
https://github.com/kubernetes/kubernetes
kubernetes是一种开源的容器编排工具,通过调度系统维持用户预期数量和状态的容器正常运行。
kubernetes提供的功能:
• 服务发现和负载均衡:Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
• 存储编排
Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等
• 自动部署和回滚
您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。
• 自我修复
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
• 密钥与配置管理
Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
3. Kubernetes四组基本概念
1. Pod Pod控制器
2. Name Namespace
3. Label Label选择器
4. Service Ingress
1个Pod里面可以运行多个容器, 他们共享了UTS NET IPC名称空间
边车() 模式 SideCar
Deployment
DaemonSet
ReplicaSet
StatefulSet
Job
Cronjob
资源apiVersion 类别Kind 元数据metadata 定义清单spec 状态status
名称一般在元数据中
相互隔离,使资源互不影响
K8S内部的虚拟集群组
默认的名称空间: default kube-system kube-pulic
主要用来分类管理资源对象,一个标签可以对应多个资源,一个资源也可以有多个标签,是多对多的关系.
一个资源拥有多个标签可以实现不同维度的管理
标签的组成就是 key=value
于标签类似的就是注解其实就是注释
资源打上标签之后,可以通过标签选择器来过滤你指定的标签,目前有两个,一个是基于等值和集合
使用基于等值的选择器时,选择器的所有键值和其他资源对象的label键值完全相同(包括数量,key和value),才能匹配。
而使用基于集合的label选择器,只要选择器部分键值匹配其他资源对象的label,就算匹配。选择器可以由一个以上条件(KV键值)组成,在多个条件的情况下,所有条件都必须满足
matchlabels
matchExpressions
对外的访问接口 只能L4流量调度(只能基于4层进行对外访问主要是 IP PORT)
kubernetes抽象出来一个概念,可以理解为负载均衡器,后端接pod
工作在OSI第七层的应用 对集群外部暴露集群内部service的一种方式
4. Kuberneter核心组件
1. 配置存储中心 etcd服务
etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。在二进制部署etcd集群的时候,必须要考虑到高可用方案,一般部署三个或者三个以上的奇数个节点,因为当master宕机时,是通过选举制度来选择master的。
2. 主控节点master
master和node是两个逻辑上节点,当服务器资源充足时,可以将其分开在不同的机器上部署,当服务器资源不足时,也可以放到同一台机器上部署。master节点在部署的时候必须要考虑高可用方案,至少部署两个master。主控节点上主要是以下服务
主节点上负责提供 Kubernetes API 服务的组件;它是 Kubernetes 控制面的前端。是整个集群中资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。
apiserver提供了集群管理的restful api接口(鉴权、数据校验、集群变更等),负责和其它模块之间进行数据交互,承担了通信枢纽功能。
通过kubectl操作集群资源时需要登陆到master节点之上,而跨主机调用apiserver时,直接通过master前端的负载均衡来实现,详细可以参考:https://www.yuque.com/duduniao/ww8pmw/tr3hch
controller manager 译为“控制器管理器”,k8s内部有很多资源控制器,比如:Node Controller、Replication Controller、Deployment Controller、Job Controller、Endpoints Controller等等,为了降低复杂度,将这些控制切都编译成了一个可执行文件,并且在同一个进程中运行。
controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。
调度器组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。
当前各个node节点资源会通过kubelet汇总到etcd中,当用户提交创建pod请求时,apiserver将请求交给controller manager处理,controller manager通知scheduler进行筛选合适的node。此时scheduler通过etcd中存储的node信息进行预选(predict),将符合要求的node选出来。再根据优选(priorities)策略,选择最合适的node用于创建pod。
3. 运算节点(node)节点
在Kubernetes集群的服务节点上,主要运行以下进程:Doker,kubelet和kube-proxy
主要功能:就是定时的从某个地方获取节点上pod的期望状态(运行什么容器 运行的数量 网路 存储)并调用对应的容器平台接口达到这个状态 定时汇报当前节点的状态给apiserver 镜像和容器的清理工作 保证镜像不会占用太多磁盘空间, 容器不会占用太多资源
podip clusterip
建立了pod网路和集群网络的关系
流量调度方式
1. Userspace 废弃
2. IPtable 频临废弃
3. IPs 推荐
4. CLI客户端
kubectl命令行工具
5.核心附件
1. CNI网络插件 flannel /calico
Kubernetes设计了网络模型,但是却将具体实现方式交给了网络插件来实现,CNI网络插件实现的是pod之间跨宿主机进行通信。默认情况下安装好node节点后,无法跨node进行宿主机通信可以参考(https://www.yuque.com/duduniao/ww8pmw/tr3hch
2. 服务发现插件 coredns
在k8s集群中pod的IP地址会发生变化,k8s通过标签选择器筛选出一组pod,这组pod共同指关联到抽象资源service,这个service拥有固定的IP地址,即cluster ip。此时无论后端的pod如何变化,都可以请求都可以通过service到达后端的pod上。 每个service有着自己的名称和cluster IP地址,可以通过IP地址直接访问到service后端对应的pod资源,也可以使用DNS将cluster ip 和 service 名称关联,实现通过service的名称访问后端pod。kubernetes的dns插件有kube-dns和coredns两种,在kubernetes 1.11 开始使用coredns较多,在此之前使用kube-dns比较多。
使用dns解析时,如果在pod外,需要使用全域名解析如:nginx-web.default.svc.cluster.local,pod内部则可以使用短域名。
3. 服务暴露插件 traefik
service是将一组pod管理起来,提供了一个cluster ip和service name的统一访问入口,屏蔽了pod的ip变化。
ingress 是一种基于七层的流量转发策略,即将符合条件的域名或者location流量转发到特定的service上,而ingress仅仅是一种规则,k8s内部并没有自带代理程序完成这种规则转发。ingress-controller 是一个代理服务器,将ingress的规则能真正实现的方式,常用的有 nginx,traefik,haproxy。但是在k8s集群中,建议使用traefik,性能比haroxy强大,更新配置不需要重载服务,是首选的ingress-controller。
4. GUI管理插件 Dashboard
Dashboard是管理Kubernetes集群一个WEB GUI插件,可以再浏览器中实现资源配置和查看。可参考:https://www.yuque.com/duduniao/ww8pmw/myrwhq
5. Kubernetes三条网络
10.0.0.0/24 两台 21 22
172.17.0.0/24
172.0.21.0/24
172.0.22.0/24
172.0.0.0/16(大网络使各个容器网路之前实现通信)
192.168.0.0/16
6. Kubernetes架构

7. Kubernetes安装方式
1. minikube 单节点微型k8s 简单的学习和预览使用
2. 二进制安装方式 (生产首选, 新手推荐)
3. 使用kubeadmin进行部署,K8s的部署工具, 相对简单 熟手推荐
1. 5台虚拟机 3台 2c 2G 50G 2台 4G内存 使用10.0.0.0/24网络
2. 安装centos-7.6系统 做好基础优化
3. 安装部署bind9 部署自建的DNS系统
4. 安装部署Docker环境 部署Harbor私有仓库
持续集成
基础环境准备好
7.6 内核 3.8以上
关闭防火墙和selinux
时间同步
更新yum源
内核优化 内核转发 文件描述符大小
安装部署好bind9 内网DNS系统
安装部署Docker的私有仓库Harbor
准备证书,签发证书 cfssl
安装部署主节点服务4个
Etcd
Apiserver
COntroller-manager
Scheduler
安装部署运算节点2个
Kubelet
kube-proxy
关于cfssl证书工具:
cfssl: 证书签发的主要工具
cfssl-json: 将cfssl生成的证书(json)格式变为承载式证书
cfssl-certinfo: 验证证书的信息
关于kubeconfig文件:
是一个k8s用户的配置文件
存放的是证书的信息
证书过期或者更换,需要同步替换该文件
主机名: 角色 IP
gcc-11 k8s代理节点1 10.0.0.11
gcc-12 k8s代理节点2 10.0.0.12
gcc-21 k8s运算节点1 10.0.0.21
gcc-22 k8s运算节点2 10.0.0.22
gcc-200 k8s运维节点 10.0.0.200
8. Bind9安装部署
[root@gcc-11 ~]$ yum install bind bind-utils.x86_64 32:9.11.4-16.P2.el7_8.6 -y
[root@gcc-11 ~]$ vim /etc/named.conf
options {
listen-on port 53 { 10.0.0.11; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
forwarders { 10.0.0.2; };
........
dnssec-enable no;
dnssec-validation no;
[root@gcc-11 ~]$ named-checkconf
[root@gcc-11 ~]$ vim /etc/named.rfc1912.zones
zone "host.com" IN {
type master;
file "host.com.zone";
allow-update { 10.0.0.11; };
};
zone "od.com" IN {
type master;
file "od.com.zone";
allow-update { 10.0.0.11; };
};
[root@gcc-11 ~]$ vim /var/named/host.com.zone
$ORIGIN host.com.
$TTL 600 ; 10 minutes
@ IN SOA dns.host.com. dnsadmin.host.com. (
2020060401 ; 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.0.0.11
gcc-11 A 10.0.0.11
gcc-12 A 10.0.0.12
gcc-21 A 10.0.0.21
gcc-22 A 10.0.0.22
gcc-200 A 10.0.0.200
[root@gcc-11 ~]$ vim /var/named/od.com.zone
$ORIGIN od.com.
$TTL 600 ; 10 minutes
@ IN SOA dns.od.com. dnsadmin.od.com. (
2019060401 ; 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.0.0.11
[root@gcc-11 ~]$ named-checkconf
[root@gcc-11 ~]$ systemctl restart named
systemctl enable named
[root@gcc-11 ~]$ netstat -lntp | grep 53
tcp 0 0 10.0.0.11:53 0.0.0.0:* LISTEN 7089/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 7089/named
tcp6 0 0 ::1:953 :::* LISTEN 7089/named
[root@gcc-11 ~]$ dig -t A gcc-11.host.com @10.0.0.11 +short
10.0.0.11
[root@gcc-11 ~]$ dig -t A gcc-200.host.com @10.0.0.11 +short
10.0.0.200
[root@gcc-11 ~]$ dig -t A gcc-21.host.com @10.0.0.11 +short
10.0.0.21
[root@gcc-11 ~]$ dig -t A gcc-12.host.com @10.0.0.11 +short
10.0.0.12
[root@gcc-11 ~]$ vim /etc/sysconfig/network-scripts/ifcfg-ens32
DNS1=10.0.0.11
[root@gcc-11 ~]$ cat /etc/resolv.conf
search host.com
nameserver 10.0.0.11
9. 准备签发证书
[root@gcc-200 ~]$ wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl
[root@gcc-200 ~]$ wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/bin/cfssl-json
[root@gcc-200 ~]$ wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/bin/cfssl-certinfo
[root@gcc-200 ~]$ ll /usr/bin/cfssl*
-rwxr-xr-x 1 root root 10376657 Mar 30 2016 /usr/bin/cfssl
-rwxr-xr-x 1 root root 6595195 Mar 30 2016 /usr/bin/cfssl-certinfo
-rwxr-xr-x 1 root root 2277873 Mar 30 2016 /usr/bin/cfssl-json
[root@gcc-200 ~]$ chmod +x /usr/bin/cfssl*
[root@gcc-200 ~]$ mkdir -p /opt/certs
[root@gcc-200 /opt/certs]$ vim /opt/certs/ca-csr.json
{
"CN": "oldboyEdu",
"hosts": [
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "shanghai",
"L": "shanghai",
"O": "od",
"OU": "ops"
}
],
"ca": {
"expiry": "175200h"
}
}
[root@gcc-200 ~]$ cd /opt/certs
[root@gcc-200 /opt/certs]$ cfssl gencert -initca ca-csr.json | cfssl-json -bare ca
2020/06/04 15:57:28 [INFO] generating a new CA key and certificate from CSR
2020/06/04 15:57:28 [INFO] generate received request
2020/06/04 15:57:28 [INFO] received CSR
2020/06/04 15:57:28 [INFO] generating key: rsa-2048
2020/06/04 15:57:28 [INFO] encoded CSR
2020/06/04 15:57:28 [INFO] signed certificate with serial number 85131540293224189869700802768351737191462236955
[root@gcc-200 /opt/certs]$ ll
total 16
-rw-r--r-- 1 root root 330 Jun 4 15:54 ca-csr.json
-rw------- 1 root root 1679 Jun 4 15:57 ca-key.pem
-rw-r--r-- 1 root root 997 Jun 4 15:57 ca.csr
-rw-r--r-- 1 root root 1350 Jun 4 15:57 ca.pem
10. 准备Docker环境
[root@gcc-200 /opt/certs]$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
[root@gcc-200 /opt/certs]$ mkdir -p /data/docker
[root@gcc-200 /opt/certs]$ systemctl start docker
[root@gcc-200 /opt/certs]$ systemctl enable docker
[root@gcc-200 /opt/certs]$ 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://q2gr04ke.mirror.aliyuncs.com"],
"bip": "172.x.x.1/24",
"exec-opts": ["native.cgroupdriver=systemd"],
"live-restore": true
}
[root@gcc-200 /opt/certs]$ systemctl restart docker