容器运行的根本:文件系统是静态的,容器运行真正靠的是文件系统树映射之下的我们所要启动的进程树为根本骨架进行运行的。系统向PID发送终止信,PID号为1的进程结束,容器退出运行转为停滞状态。
namespace名称空间隔离系统:mount,pid,network,uts,user,ipc,control group(cgp),time
容器通信:
bridge :桥接口,二层虚拟网桥,docker自身有DHCP(动态地址分发功能)当 容器启动关联到二层的虚拟网桥时会自动获得一个同一网段IP地址;但是容器到达一定阈值时后会发生IP冲突,产生广播风暴。
host:根名称空间,共享 套接字,套接字具有排他性,会独占
container(容器监控项):共享network/uts/namespace
基于同一镜像可以在任意节点上跑,volume 独立于宿主机生命周期的共享式存储,以实现持久化存储。
什么是容器编排技术:单个容器没有生产力,必须考虑到容器和容器所依赖的底层基础设施协同起来和其他容器共同组成信息系统的过程叫容器编排技术,要管理整个容器的生命周期,和依赖到的外部基础设施的周期,要使其联动起来,不需要太多的人为干预,需要配备的资源由系统自动配备到位。
kubernetes节点类型
master:控制节点 采取多副本运行避免称成为单点
kube-apiserver ,kube-scheduler ,etcd(集群状态存储),kube-controllger-manger
worker:工作节点
kubelet :kubernetes集群于每一个worker节点上的代理,接受并执行master发出的指令,管理由scheduler绑定到当前节点上的pod容器,通过APIserver接受pod资源定义,从节点本地目录加载静态pod配置,借助于兼容CRI的容器运行时管理和监控pod相关容器
kube-proxy:运行在每个节点上,专用于将service资源定义转为节点本地实现,是打通pod网络在service网络的关键所在
IP tables:将service资源的定义转为适配当前节点视角的IP tables规则
IP VS:将service资源定义转为适配当前节点视角的IP VS和少量IP tables规则
container runtime
kubelet 扩展功能对容器的具体实现:CRI(container runtime),CNI(提供网络插件),CSI(存储解决方案)
addons :附件
network plugin:网络插件,经由CNI接口,负责pod提供专用的通信网络
coreDNS :集群DNS,负责服务注册,发现和名称解析
dashboard: 图形界面接口 基于WEB的UI
指标监控系统:Prometheus
日志系统:ELK,PLG
ingress controller:负责为ingress资源提供具体实现,实现HTTP/HTTPS 的七层路由和流量调度
声明式API工作的基本逻辑
声明:API server是终态声明式API 向APIserver提交创建数据对象,如果声明的是pod ,controller 把声明提交的对象保存在etcd当中的数据进行调用;而真正将pod跑起来是由kubelet 负责
实现:由控制器controller从apiserver读取声明,并对声明中对应的具体实例进行实现,并确保期望状态和实际状态始终一致,由reconciltion loop调谐循环(始终持续执行)实现
多个pod运行后需要流量分发,直接分发优于跃点分发,对于每一个应用来讲,在客户端(存在于集群任何一个上)所在的内核上把应用定义成虚拟服务,将其对应的后端服务器pod ip地址都作为realserver 并关联起来。由service 定义一个虚拟IP地址 和端口,进行动态发现,由kv标签和标签选择器进行过滤和分发,到达后端realserver。
虚拟服务器及上游对应端点流量分发实现过程:k8s自带servers插件,为每个应用创建负载均衡器;由servers 创建labelseleter(端口和标签选择器),提供给kube-apiserver,随后由server控制器 结合kube-proxy进行工作,proxy将apiserver当中的service读出来,转化为当前节点内核当中的IPVS和realserver定义;转化由laberselecter挑选出的pod在apiserver中都有定义。
pod与应用
本质上是以应用为中心的现代应用基础设施, pod是其运行应用及应用调度最小的逻辑单元,本质上是共享network,ipc,uts名称空间以及存储资源的容器集,模拟不可变基础设施,删除后可通过资源清单重建,在设计上将具有超亲密关系的应用分别以不同容器形式运行在同一pod内部。
kubernetes 网络模型
三网四流量
节点网络:集群节点间的通信网络,负责打通与集群外部端点间的通信;网络及各节点地址需要kubernetes部署前完成配置,非由k8s管理,因而需要由管理员手动进行或借助于主机虚拟化管理程序进行
pod网络:集群上的pod对象提供的网络,虚拟网络需要经由CNI网络插件实现
server网络:在部署k8s集群时指定,各server对象使用的地址将从网络中分配,service对象的IP地址存在于其相关的IP tables或IP VS当中,由集群自行管理
kuberneter四种主要通信流量
同一pod内的容器通信
pod间的通信
pod与service间的通信
集群外部流量与service间的通信
pod网络需要借助第三方兼容CNI规范网络插件完成,需要满足以下功能:
所有pod间均不可经NAT机制而直接通信
所有节点均可不经NAT机制直接与所有pod通信
所有pod平面都位于同一网络中
kubernetes部署
独立主件模式
静态pod模式
kubeadm
负责执行构建一个最小化可用集群并将其启动等必要的基本步骤
全生命周期管理工具,可用于实现集群部署升级降级卸载等
paxos协议是分布式的基石
系统配置
OS: Ubuntu 20.04.1
Kubernetes:v1.24
Container Runtime: Docker CE 20.10.17
CRI:cri-dockerd v0.2.2
网络环境
node:172.29.1.0/24
pod:192.168.0.0/16
service:10.96.0.0/12
1.关闭防火墙
systemctl mask firewalld
ufw disable
ufw status
2.禁用swap分区
swapoff -a && systemctl --type swap && systemctl mask SWAP_DEV
vim /etc/fstab
#/swap.img none swap sw 0 0 #禁用swap
reboot
3.时间同步
tzselect
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
apt install chrony
systemctl start chrony.service
4.集群节点解析
vim /etc/hosts
172.29.1.1 master01.magedu.com master01 kubeapi.magedu.com kubeapi
172.29.1.11 node01.magedu.com node01
172.29.1.12 node02.magedu.com node02
172.29.1.13 node03.magedu.com node03
5.安装docker-ce配置镜像加速
apt -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt update
apt install docker-ce
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl daemon-reload
systemctl start docker.service
systemctl enable docker.service
systemctl status docker.service && systemctl status cri-docker.service
6.安装kubernetes 组件
curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.2/cri-dockerd_0.2.2.3-0.ubuntu-focal_amd64.deb
apt install ./cri-dockerd_0.2.2.3-0.ubuntu-focal_amd64.deb
apt update && apt install -y apt-transport-https curl
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat </etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt update
apt install -y kubelet kubeadm kubectl
systemctl enable kubelet
systemctl status kubelet.service #默认不启动,进行环境初始化时会自动启动,node节点自动加入master
7.整合kubelet和cri-dockerd
cat /usr/lib/systemd/system/cri-docker.service #此为默认文件,如果没有请重装cri-docker
vim /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d
systemctl daemon-reload && systemctl restart cri-docker.service && systemctl status cri-docker.service
scp /usr/lib/systemd/system/cri-docker.service [email protected]:/usr/lib/systemd/system/cri-docker.service
#传输到其他三台机器上
8.初始化master节点和node节点
kubeadm reset --cri-socket unix:///run/cri-dockerd.sock #重新构建集群
rm -rf /etc/kubernetes/ /var/lib/kubelet/
kubeadm init --control-plane-endpoint kubeapi.magedu.com --kubernetes-version=v1.24.3 --pod-network-cidr=192.168.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --cri-socket unix:///run/cri-dockerd.sock#初始化master
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
kubeadm join kubeapi.magedu.com:6443 --token ie0kq8.pclhrbo9zqvn210w --discovery-token-ca-cert-hash sha256:3c96819f3e55aff412a6a743d8829503028c567fd9cce917bcd992751c9dec36 --cri-socket unix:///run/cri-dockerd.sock#初始化node节点
kubectl get nodes
9.测试应用编排及服务访问
kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=3
kubectl get pods -o wide
kubectl create service nodeport demoapp --tcp=80:80
while true; do curl 10.99.65.144; sleep 3.RANDOM; done
9.测试应用编排及服务访问
kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=3
kubectl get pods -o wide
kubectl create service nodeport demoapp --tcp=80:80
while true; do curl 10.99.65.144; sleep 3.RANDOM; done