1. K8S 简介和认证介绍

温馨提醒
总结摘要
本文系统介绍了 Kubernetes 的起源、核心架构与基本概念,涵盖 Master/Node 节点组件功能、Pod/Controller/Service/Label/Namespace 等关键资源模型,并详细对比了 Minikube、Kind、kubeadm 及二进制等多种部署方式。同时提供基于 kubeadm 在 CentOS 7 上从零搭建高可用 Kubernetes 集群的完整操作指南,包括环境准备、内核参数调优、镜像加速、网络插件(Flannel)安装及节点加入流程。最后简要说明 CKA 认证考试要点,为初学者构建完整的 K8S 入门知识体系。

Kubernetes简介

Kubernetes 是 google 在2014年开源的一个容器集群管理系统,简称K8S。 K8S用于容器化应用程序的部署,扩展和管理。 K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。 Kubernetes目标是让部署容器化应用简单高效。

官网:https://kubernetes.io/zh/

Kubernetes管理员认证(CKA)

考试允许查阅官方文档

https://hubernetes.io

https://github.com

考试时长:三个小时

满分100分,66分及格。

费用300美元

有一次免费重考机会一年后过期

K8S整体结构

image-20211116215305911

Master

控制节点,对集群进行调度管理,接受集群外用户去集群操作请求。Master节点由API Server、Scheduler、ClusterState Store(ETCD数据库)和Controller Manger Server组成

Node

集群工作节点,运行用户业务

Nodes节点也叫做Worker Node,包含kubelet、kube proxy和(Container Runtime)

image-20211116220950103-16370718066542

Master节点Node节点
1、kube-apiserver
Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给 APIServer处理后再提交给Etcd存储。
2、kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而 ControllerManager就是负责管理这些控制器的。
3、kube-scheduler 根据调度算法为新创建的Pod选择一个Node节点,可以任意部 署,可以部署在同一个节点上,也可以部署在不同的节点上。
4、etcd 分布式键值存储系统。用于保存集群状态数据,比如Pod、Service 等对象信息。
1、kubelet
kubelet是Master在Node 节点上的Agent,管理本机 运行容器的生命周 期,比如创建容器、Pod挂 载数据卷、下载secret、获 取容器和节点状态 等工作。kubelet将每个 Pod转换成一组容器。
2、kube-proxy
在Node节点上实现Pod网 络代理,维护网络规则和四 层负载均衡工作。
3、docker或rocket
容器引擎,运行容器。

K8S搭建方式

1、 minikube

minikube可以再本地运行kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS,LinuxPC)上运行一个单节点kubernetes集群,以便使用k8s或进行日常开发工作;

https://kubernetes.io/docs/tutorials/hello-minikube/

2、 kind

Kind和minikube类似的工具,在本地计算机上运行kubernetes,此工具需要安装并配置docker;

https://kind.sigs.k8s.io/

3、 kubeadm

kubeadm是一个k8s部署工具,提供kubeadm init和kubeadm join两个操作命令,可以快速部署一个k8s集群;

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

4、 二进制包

从GitHub下载发行版的二进制包,手动部署安装每个组件,组成kubernetes集群,步骤比较繁琐,但是能对各个组件有更清晰的认识。

5、 yum安装

通过yum安装kubernetes的每个组件,组成kubernetes集群,但是yum源里面的k8s版本比较老,所这种方式用的少。

6、 第三方工具

7、 花钱买

直接购买共有云平台k8s

Kubernetes基础概念

1、pod

  • 最小部署单元
  • 一组容器的集合
  • 一个Pod中的容器共享网络命名空间
  • Pod是短暂的

2、Controllers

  • ReplicaSet : 确保预期的Pod副本数量
  • Deployment : 无状态应用部署
  • StatefulSet : 有状态应用部署
  • DaemonSet : 确保所有Node运行同一个Pod
  • Job : 一次性任务
  • Cronjob : 定时任务

更高级层次对象,部署和管理Pod

3、Server

  • 防止Pod失联
  • 定义一组Pod的访问策略

4、Label:标签,附加到某个资源上,用于关联对象、查询和筛选

5、Namespace:命名空间,将对象逻辑上隔离

Kubeadm部署Kubernetes

kubernetes是官方社区推出的一个用于快速部署K8S集群的工具,这个工具可以通过两条指令完成一个kubernetes集群的部署。

1、创建一个Master节点

1
kubeadm init

2、将node节点加入到Master集群中

1
$ kubeadm join <Master 节点的IP和端口>

Kubernetes部署环境准备

1、 一台或多台机器,操作系统CentOS 7.x-86_x64

2、 硬件配置:内存 >=2G,CPU >=2核

3、 集群内

4、 集群内各个机器可以访问外网,需要拉取镜像

5、 禁止swap分区

如果环境不满足要求会报错

一、环境说明

主机IP资源角色
node1.chang.com192.168.100.101>=2v >=2gmaster
node2.chang.com192.168.100.102>=2v >=2gworker
node3.chang.com192.168.100.103>=2v >=2gworker
node4.chang.com192.168.100.104>=2v >=2gworker
node5.chang.com192.168.100.105>=2v >=2gworker

二、时间同步,所有主机操作

1
2
[root@node1 ~]# yum install ntpdate -y
[root@node1 ~]# ntpdate time.windows.com

三、关闭防火墙、selinux、swap,所有主机操作

1
2
3
4
5
6
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

四、修改/etc/hosts文件,所有主机操作

1
2
3
4
5
192.168.100.101		node1.chang.com		node1
192.168.100.102		node2.chang.com		node2
192.168.100.103		node3.chang.com		node3
192.168.100.104		node4.chang.com		node4	
192.168.100.105		node5.chang.com		node5

五、配置内核参数,将桥接的IPv4流量传递到iptables,所有主机操作

1
2
3
4
5
6
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system

六、生成yum源,所有主机操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
##将本地源备份,添加Centos源
yum install -y wget
mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
wget -O /etc/yum.repos.d/CentOS-Base.repo
http://mirrors.cloud.tencent.com/repo/centos7_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel7.repo
##kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
##docker 源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O
/etc/yum.repos.d/docker-ce.repo
##重新构建yum缓存
yum clean all && yum makecache -y

七、安装docker,在所有主机操作

1
2
3
4
5
6
yum install docker-ce -y
systemctl start docker
systemctl enable docker
#查看版本
docker --version
Docker version 20.10.10, build b485636

八、安装kubelet:管理pod生命周期 kubeadm:部署K8S的工具 kubectl:管理K8S资源的工具,在所有主机操作

1
2
3
4
5
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
##安装时可以指定版本,如果不指定则安装最新版
##kubelet-1.19.0-0 kubeadm-1.19.0-0 kubectl-1.19.0-0
yum install kubectl-1.19.1 kubelet-1.19.1 kubeadm-1.19.1 -y

九、初始化K8S集群,只在master上操作

image-20211117191705316

镜像包的导入

因为默认的源下载会很慢,所以使用本地包导入的方式,避免因为下载镜像出现的问题。

image-20220104154913508

将这四个包上传至节点,使用docker load -i filename命令导入镜像。

在线获取镜像包:

image-20220121165723020

查看最新镜像的版本号:

然后使用下列脚本,执行下载镜像,注意要替换版本号即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
images=(
	kube-apiserver:v1.23.2
	kube-controller-manager:v1.23.2
	kube-scheduler:v1.23.2
	kube-proxy:v1.23.2
	pause:3.6
	etcd:3.5.1-0
	coredns:1.8.6
)

for imageName in ${images[@]};do
	docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
	docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
	docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName 
done

下载完成之后使用``docker images`查看本地的镜像

初始化之前使用kubectl versionkubeadm version

image-20220121221144540

1
2
3
kubeadm init --kubernetes-version=1.22.3 --apiserver-advertise-address=192.168.100.101 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
##--kubernetes-version=版本号需要和kubeadm版本号一致
##Service-cidr的选取不能和podCIDR及本机网路有重叠或冲突,一般可以选择一个本机网络和PodCIDR都没有用到的私网地址段,比如PodCIDR使用10.244.0.0/16,那么service cidr可以选择10.96.0.0/12,网络无冲突即可;

!!!如果这里出现问题,先拍错,之后清除之前的配置,再次执行初始化命令

1
kubeadm reset		##清除之前执行一半的操作,

!!!当kuebelet的cgroup与docker 的cgroup不匹配时,可以修改docker的cgroup

1
2
3
4
5
6
vi /etc/docker/daemon.json
{
 "exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl restart docker
systemctl status kubelet.service

十、获取集群控制权限,只在master上操作

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

十一、使用生成token令牌,将node节点加入到k8s中

在初始化完成K8S集群后Master节点会出现以下token令牌,在worker节点上执行即可加入集群

image-20211116222905567

1
2
3
kubeadm join 192.168.100.101:6443 --token j6je0l.0q2sv1whd63nrf65 --discovery-token-ca-cert-hash sha256:dd65c0d402337707d5a10497533505636d3e93dac52091cca83b32724b3a944f
##如果后期还想再加入更多的node节点,可以生成新的token令牌
#kubeadm token create --print-join-command

十二、添加网络插件,只在master上操作

1
2
3
4
5
6
7
8
9
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master.example.com NotReady control-plane,master 13m v1.22.3
k8s-node1.example.com NotReady <none> 3m31s v1.22.3
k8s-node2.example.com NotReady <none> 3m26s v1.22.3
k8s-node3.example.com NotReady <none> 3m24s v1.22.3
flannel插件配置清单:
https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

十三、验证最终结果

image-20211116223056045

1
2
kubectl get pod -n kube-system
kubectl get node