Kubernetes介绍和架构

Kubernetes 建立在 Google 公司超过十余年的运维经验基础之上,Google 所有的应用都运行在容器上,

再与社区中最好的想法和实践相结合,Google 每周运行数十亿个容器,Kubernetes 基于与之相同的原

则来设计,能够在不扩张运维团队的情况下进行规模扩展,当前已成为最受欢迎和行业最主流的容器管

理平台。

Kubernetes 用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用

简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的强大和灵活的机制。

Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行

着,用户可以运行一个微型服务,让规划器来找到合适的位置节点,后续用户不需要关心怎么去做,

Kubernetes会自动去监控,然后去重启,新建等,总之让应用可以一直提供服务,同时,Kubernetes

系提供了人性化的相关工具,可以让用户能够方便的部署自己的应用

Kubernetes特性

自动化上线和回滚

Kubernetes 会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同

时终止所有实例。如果出现问题,Kubernetes 会为你回滚所作更改。你应该充分利用不断成长的部署

方案生态系统。

服务发现与负载均衡

无需修改你的应用程序即可使用陌生的服务发现机制。Kubernetes 为容器提供了自己的 IP 地址和一个

DNS 名称,并且可以在它们之间实现负载均衡。

存储编排

自动挂载所选存储系统,包括本地存储、诸如 GCP 或 AWS 之类公有云提供商所提供的存储或者诸如

NFS、iSCSI、Gluster、Ceph、Cinder 或 Flocker 这类网络存储系统。

水平扩缩

使用一个简单的命令、一个 UI 或基于 CPU 使用情况自动对应用程序进行扩缩。

自我修复

重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器,并

且在它们准备好服务之前不会将它们公布给客户端。

为扩展性设计

无需更改上游源码即可扩展你的 Kubernetes 集群。

自动装箱

根据资源需求和其他约束自动放置容器,同时避免影响可用性。 将关键性的和尽力而为性质的工作负载

进行混合放置,以提高资源利用率并节省更多资源。

批量执行

除了服务之外,Kubernetes 还可以管理你的批处理和 CI 工作负载,在期望时替换掉失效的容器。

IPv4/IPv6 双协议栈

为 Pod 和 Service 分配 IPv4 和 IPv6 地址

Secret 和配置管理

部署和更新 Secret 和应用程序的配置而不必重新构建容器镜像, 且不必将软件堆栈配置中的秘密信息

暴露出来。

Kubernetes架构

Kubernetes 是一个分布式系统,是由很多主机节点组成,且各个节点的分工不同

Kubernetes 的主机节点主要有两种类型

Master节点:

管理(控制)节点,相当于公司的总部

Master 节点主要由 API Server 、Controller-Manager 和Scheduler 三个组件,以及一个用于存储集群状态的 Etcd存储服务组成

graph 
A(API Server入口) -->B(Scheduler调度) --> C(Controller控制器 容器扩缩容) --> D(ETCD 数据库 持久化)

Node节点:

也称为工作worker节点或者Minion节点,相当于公司的分部

Node节点则主要包含 Kubelet 、Kube Proxy 及容器运行时( 当前docker 仍是最为常用的实现)三个组件,它们承载运行各类应用容器

Kubernetes的节点运行逻辑

Kubernetes将所有worker工作节点的资源集结在一起形成一台逻辑的更加强大的“服务器”

计算和存储接口通过Master之上的API Server暴露客户端通过API提交应用程序的运行请求,而后由Master通过调度算法将其自动指派至某特定的工

作节点以Pod对象的形式运行Master会自动处理因工作节点的添加、故障或移除等变动对Pod的影响

Kubernetes组件分为三种

  • Control Plane Components 控制平台组件
  • Node Components 节点组件
  • Addons 附件

附件

  • 网络附件(必要) 容器网络 flanel,calico,cilium
  • dashborad 图形管理工具,kubesphere
  • Ingress 七层代理
  • Metablab SVC

Kubernetes拓展接口

Kubernetes提供了三个特定功能的接口,kubernetes通过调用这几个接口,来完成相应的功能。
容器运行时接口CRI: Container Runtime Interface
CRI 首次发布于2016年12月的Kubernetes 1.5 版本。
在此版本之前,Kubernetes 直接与 Docker 通信,没有标准化的接口。
从 Kubernetes 1.5 开始,CRI 成为 Kubernetes 与容器运行时交互的标准接口,使得 Kubernetes
可以与各种容器运行时进行通信,从而增加了灵活性和可移植性。
kubernetes 对于容器的解决方案,只是预留了容器接口,只要符合CRI标准的解决方案都可以使用
容器网络接口CNI: Container Network Interface
kubernetes 对于网络的解决方案,只是预留了网络接口,只要符合CNI标准的解决方案都可以使用
容器存储接口CSI: Container Storage Interface
kubernetes 对于存储的解决方案,只是预留了存储接口,只要符合CSI标准的解决方案都可以使用
此接口非必须

容器运行时接口(CRI)

CRI是kubernetes定义的一组gRPC服务。Kubelet作为客户端,基于gRPC协议通过Socket和容器运行时

通信。

CRI 是一个插件接口,它使 kubelet 能够使用各种容器运行时,无需重新编译集群组件。

Kubernetes 集群中需要在每个节点上都有一个可以正常工作的容器运行时, 这样 kubelet 能启动 Pod
及其容器。
容器运行时接口(CRI)是 kubelet 和容器运行时之间通信的主要协议。
CRI 包括两类服务:
镜像服务(Image Service)
镜像服务提供下载、检查和删除镜像的远程程序调用。
运行时服务(Runtime Service)
运行时服务包含用于管理容器生命周期,以及与容器交互的调用的远程程序调用

kubernetes集群部署

基于Kubeadm Docker 部署 kubernetes 高可用集群

kubeadm是Kubernetes社区提供的集群构建工具

  • 负责执行构建一个最小化可用集群并将其启动等必要的基本步骤

  • Kubernetes集群全生命周期管理工具,可用于实现集群的部署、升级/降级及卸载等

  • kubeadm仅关心如何初始化并拉起一个集群,其职责仅限于下图中背景蓝色的部分

  • 蓝色的部分以外的其它组件还需要自行部署

基于 kubeadm 和 Docker 实现Kubernetes集群流程说明
  • 每个节点主机的初始环境准备

  • 准备代理服务,以便访问k8s.gcr.io,或根据部署过程提示的方法获取相应的I国内镜像的image(可
    选)

  • Kubernetes集群API访问入口的高可用和harbor(可选)

  • 在所有Master和Node节点都安装容器运行时 Docker

  • 在所有节点安装和配置 cri-dockerd(kubernetes-v1.24版本以后需要)

  • [ERROR Mem]: the system RAM (952 MB) is less than the minimum 1700 MB

  • 物理主机网络 10.0.0.0/24

  • 集群pod网络 –pod-network-cidr=10.244.0.0/16

  • 应用service网络 –service-cidr=10.96.0.0/12

  • 在所有Master和Node节点都安装kubeadm 、kubelet、kubectl(集群管理工具,在node节点可
    不安装)

  • 在第一个 master 节点运行 kubeadm init 初始化命令 ,并验证 master 节点状态

  • 在第一个 master 节点安装配置CNI规范的网络插件flannel,calico等

  • 在其它master节点运行kubeadm join 命令加入到控制平面集群中实现高可用(测试环境可选)

  • 在所有 node 节点使用 kubeadm join 命令加入集群 , 并验证 node 节点状态

  • 创建 pod 并启动容器测试访问 ,并测试网络通信

IP 主机名 角色
10.0.0.100 kubeapi.wilh.net VIP, 在ha1和ha2主机实现
10.0.0.101 master1.wilh.net k8s集群主节点1,Master和etcd
10.0.0.102 master2.wilh.net k8s集群主节点2,Master和etcd
10.0.0.103 master3.wilh.net k8s集群主节点3,Master和etcd
10.0.0.104 node1.wilh.net k8s集群工作节点1
10.0.0.105 node2.wilh.net k8s集群工作节点2
10.0.0.106 node3.wilh.net k8s集群工作节点3
10.0.0.107 ha1.wilh.net k8s主节点访问入口1,提供高可用及负载均衡
10.0.0.108 ha2.wilh.net k8s主节点访问入口2,提供高可用及负载均衡
10.0.0.110 harbor.wilh.net 容器景象仓库(可选)

物理主机网络 10.0.0.0/24

集群pod网络 –pod-network-cidr=10.244.0.0/16

应用service网络 –service-cidr=10.96.0.0/12

  1. 环境初始化

    初始准备环境

    • 每个主机至少2G以上内存,CPU2核以上
    • 操作系统: 最小化安装支持Kubernetes的Linux系统
    • 唯一的主机名,MAC地址以及product_uuid和主机名解析
    • 保证各个节点网络配置正确,并且保证通信正常
    • 禁用 swap
    • 禁用 SELinux
    • 放行Kubernetes使用到的相关端口或禁用firewalld/iptables
    • 配置正确的时区和时间同步
    • 内核参数优化
    • 所有节点实现基于 ssh key 验证(可选)
1
2
3
4
5
6
7
8
9
10
11
12
13
#按照规划配置唯一的主机名
hostnamectl set-hostname master1.wilh.net

vim /etc/hosts
10.0.0.100 kubeapi.wilh.net
10.0.0.101 master1.wilh.net master1
10.0.0.102 master2.wilh.net master2
10.0.0.103 master3.wilh.net master3
10.0.0.104 node1.wilh.net node1
10.0.0.105 node2.wilh.net node2
10.0.0.106 node3.wilh.net node3
10.0.0.107 ha1.wilh.net ha1
10.0.0.108 ha2.wilh.net ha2

禁用swap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#方法1
~# swapoff -a
~# sed -i '/swap/s/^/#/' /etc/fstab
~# for i in {101..106};do ssh 10.0.0.$i "sed -i '/swap/s/^/#/' /etc/fstab"; ssh
10.0.0.$i swapoff -a ; done
#方法2
~# systemctl stop swap.img.swap
~# systemctl mask swap.img.swap 或者 systemctl mask swap.target
#方法3
~# systemctl mask swap.img.swap 或者 systemctl mask swap.target
~# reboot

#确认是否禁用swap
~# systemctl -t swap
~# swapon -s

内核优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#加载模块
modprobe overlay
modprobe br_netfilter
lsmod |grep -E  'overlay|br_netfilter'
br_netfilter           32768  0
bridge                421888  1 br_netfilter
overlay               212992  0

#开机加载
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

#设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

#应用 sysctl 参数生效而不重新启动
sysctl --system

安装habor

配置代理

  1. 部署harbor仓库和高可用反向代理
  2. 安装haproxy
  3. 所有电脑安装docker
1
2
3
4
5
6
7
8
9
apt update %% apt -y install docker.io

docker version

for i in {102..106}; do scp daemon.json 10.0.0.$i:/etc/docker/;done

systemctl restart docker

docker info
  1. 安装docker-cri
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.18/cri-dockerd-0.3.18.amd64.tgz

tar tf cri-dockerd-0.4.0.amd64.tgz

tar xf cri-dockerd-0.4.0.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/local/bin/

wget -O /lib/systemd/system/cri-docker.service https://raw.githubusercontent.com/Mirantis/cri-dockerd/refs/heads/master/packaging/systemd/cri-docker.service

wget -O /lib/systemd/system/cri-docker.socket
https://raw.githubusercontent.com/Mirantis/cri-dockerd/refs/heads/master/packaging/systemd/cri-docker.socket

systemctl daemon-reload && systemctl enable --now cri-docker.service

vim /lib/systemd/system/cri-docker.service

#修改ExecStart行如下
#最新版Kubernetes v1.34.1
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infracontainer-image registry.aliyuncs.com/google_containers/pause:3.10
  1. 安装kubeadm
1
2
3
4
5
6
7
8
9
10
11
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb/Release.key |
gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.34/deb/ /" |
tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl

worker节点可以不装kubectl,因为这个是用来管理的

kubeadm completion bash > /etc/profile.d/kubeadm_completion.sh # 自动补全

K8s三个网络

  • 主机网络
  • 容器网络
  • SVC网络

二进制安装

容器化安装

Kubernetes集群管理工具