目录
- 为什么要用Kubernetes?
- K8s控制节点-Master概念
- K8s计算节点-Node概念
- 什么是Pod?
- 为什么要引入Pod?
- 创建一个Pod
- 零宕机发布应用必备知识:Pod三种探针
- 零宕机必备知识:StartupProbe
- 零宕机必备知识:Liveness和Readiness
- 零宕机必备知识:Pod退出流程
- 零宕机必备知识:PreStop的使用
为什么要用Kubernetes?
- 容器管理
- 自动恢复
- 健康检查
- 弹性扩容
- 内部通讯
- 高可用
K8s控制节点-Master概念
Kubernetes是谷歌以Borg为前身,基于谷歌15年生产环境经验的基础上开源的一个项目,Kubernetes致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台。
k8s高可用架构解析
k8s节点一般分为master节点和node节点,master节点一般三个足以,三个master节点承载成百上千node节点完全没有问题,node节点可以横向扩容
node节点用于部署应用程序,master节点不允许部署应用程序,它只负责控制,调度工作
Master节点:整个集群的控制中枢
Kube-APIServer
集群的控制中枢,各个模块之间信息交互都需要经过Kube-APIServer,同时它也是集群管理、资源配置、整个集群安全机制的入口。
Controller-Manager
集群的状态管理器,保证Pod或其他资源达到期望值,也是需要和APIServer进行通信,在需要的时候创建、更新或删除它所管理的资源。
Scheduler
集群的调度中心,它会根据指定的一系列条件,选择一个或一批最佳的节点,然后部署我们的Pod。
Etcd
键值数据库,报错一些集群的信息,一般生产环境中建议部署三个以上节点(奇数个)。
注意
master节点在安装完成之后,可能在很长一段时间都不会有任何的变化,所以在进行架设计的时候,要给足master节点资源,因为每次修改master节点是一件特别复杂的事情
我们在master节点绑定证书,每个证书绑定在master节点的ip地址或者主机名,如果我们在之前生成证书的时候没有预留的话,那我们可能就需要重新生成一份证书,再把之前的证书都替换掉,而且还要替换node节点上面的证书,过程非常麻烦,所以一开始要给足资源,比如一次性给三台16核64G
Etcd也特别重要,一次性给足资源,未来五到十年,node节点的个数在500到1000之间的话,我们的master节点是完全不需要做任何变化的
K8s计算节点-Node概念
node节点和master节点的区别:node节点比较具有动态性,添加、删除
Node:工作节点
Kubelet
Kubelet:负责监听节点上Pod的状态,同时负责上报节点和节点上面Pod的状态,负责与Master节点通信,并管理节点上面的Pod。
Kube-proxy
Kube-proxy:负责Pod之间的通信和负载均衡,将指定的流量分发到后端正确的机器上。
查看Kube-proxy工作模式
[root@k8s-master01 dockerfiles]# netstat -lntp |grep kube-proxy
tcp 0 0 0.0.0.0:30372 0.0.0.0:* LISTEN 1064/kube-proxy
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 1064/kube-proxy
tcp6 0 0 :::10256 :::* LISTEN 1064/kube-proxy
[root@k8s-master01 dockerfiles]# curl 127.0.0.1:10249/proxyMode
ipvs[root@k8s-master01 dockerfiles]#
Ipvs
监听Master节点增加和删除service以及endpoint的消息,调用Netlink接口创建相应的IPVS规则。通过IPVS规则,将流量转发至相应的Pod上。
Ipvs映射规则
# 查看配置规则,主机访问30372端口就可以访问到172.25.244.214
[root@k8s-master01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.0.1:30372 rr
-> 172.25.244.214:8443 Masq 1 0 0
# kubernetes-dashboard通过端口30372(kube-proxy)映射出去
[root@k8s-master01 dockerfiles]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.109.161.186 <none> 8000/TCP 6d22h
kubernetes-dashboard NodePort 10.96.188.229 <none> 443:30372/TCP 6d22h
# 172.25.244.214正好时pod的ip地址
[root@k8s-master01 ~]# kubectl get po -n kubernetes-dashboard -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dashboard-metrics-scraper-856586f554-ssjhm 1/1 Running 0 7d20h 172.18.195.8 k8s-master03 <none> <none>
kubernetes-dashboard-67484c44f6-brz2z 1/1 Running 2 (3m56s ago) 7d20h 172.25.244.214 k8s-master01 <none> <none>
主机访问node节点30372端口,通过ipvs规则,反向代理到kubernetes-dashboard上面的ip地址172.25.244.214的8443端口,所以就能访问到dashboard
Iptables
监听Master节点增加和删除service以及endpoint的消息,对于每一个Service,他都会创建一个iptables规则,将service的clusterIP代理到后端对应的Pod。
不推荐使