Kubernetes 架构
Kubernetes 主要由以下几个核心组件组成:
- etcd 保存了整个集群的状态;
- kube-apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
- kube-controller-manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- kube-scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
- kubelet 负责维持容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
- Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI),默认的容器运行时为 Docker;
- kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;
今天我们先重点说一下 kubelet 组件,kubelet 主要负责同容器运行时(比如 Docker 项目)打交道。而这个交互所依赖的,是一个称作 CRI(Container Runtime Interface)的远程调用接口,这个接口定义了容器运行时的各项核心操作,比如:启动一个容器需要的所有参数。
此外,kubelet 还通过 gRPC 协议同一个叫作 Device Plugin 的插件进行交互。这个插件,是 Kubernetes 项目用来管理 GPU 等宿主机物理设备的主要组件,也是基于 Kubernetes 项目进行机器学习训练、高性能作业支持等工作必须关注的功能。
而 kubelet 的另一个重要功能,则是调用网络插件和存储插件为容器配置网络和持久化存储。这两个插件与 kubelet 进行交互的接口,分别是 CNI(Container Networking Interface)和 CSI(Container Storage Interface)。
kubelet 完全是为了实现 Kubernetes 项目对容器的管理能力而实现的一个组件。
了解完 Kubernetes 架构后,我们今天使用 Kubeadm 部署一个 Kubernetes 集群。
使用 Kubeadm 部署 Kubernetes 集群很简单,只需要两步操作即可:kubeadm init,kubeadm join,当然在正式安装之前咱们先需要做一下基础准备!
基础环境准备
安装一个 Kubernates 最小集群需要三台机器,一台 Master 节点,两台 Node 节点,机器规划如下:
虚拟机版本 | 主机名 | IP | 角色 |
---|---|---|---|
centos7 | kubernetes-master | 192.168.136.128 | master |
centos7 | kubernetes-node1 | 192.168.136.129 | node |
centos7 | kubernetes-node2 | 192.168.136.130 | node |
-
安装并启动 Docker
安装过程略,可参看我之前的 Docker 系列文章,安装完成后使用systemctl start docker
命令启动 Docker -
使用命令将 docker 服务设置开机启动
systemctl enable docker
-
查看 docker 版本,确保各个节点安装的 docker 版本一致
-
关闭禁用各节点的防火墙
停止防火墙:systemctl stop firewalld.service
禁用防火墙:systemctl disable firewalld.service
查看防火墙状态:systemctl list-unit-files|grep firewalld.service
-
关闭各节点的 selinux
编辑/etc/selinux/config
文件并设置SELINUX
的值为disabled
-
关闭各节点的 swap
如果不关闭 kubernetes 运行会出现错误, 即使安装成功了,node 重启后也会出现 kubernetes server 运行错误。
sudo swapoff -a
-
给各节点添加 kubernetes 的 yum 源
进入目录cd /etc/yum.repos.d/
内容如下,大家可以直接复制粘贴。
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enable=1
EOF
- 查看 yum 源是否可用
yum repolist
做好上面的准备工作后,我们来安装 Kubeadm。
Kubeadm 安装
Master 安装
-
修改 master 主机名为 kubernetes-master
hostnamectl set-hostname kubernetes-master
-
卸载原 kubeadm(若有):
yum remove -y kubelet kubeadm kubectl
-
安装 kubeadm:
yum install -y kubelet kubeadm kubectl
-
重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet
- 查看 kubelet 状态:
systemctl status kubelet
如果此时执行 service status kubelet 命令,将得到 kubelet 启动失败的错误提示,请忽略此错误,因为必须完成后续步骤中 kubeadm init 的操作,kubelet 才能正常启动
- 生成 kubeadm 配置文件 kubeadm.yml
进入文件夹cd /app/k8s
,执行命令生成配置文件
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
在文件夹下,会生成一个 kubeadm.yml 文件,需要对 kubeadm.yml 进行修改。
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.136.128
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: kubernetes-master
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
dnsDomain: cluster.local
podSubnet: "192.168.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}
主要做三处修改:
修改 imageRepository 为 registry.aliyuncs.com/google_containers
阿里镜像源;
修改 kubernetesVersion
,我们使用 v1.18.0 作为 kubernetes 版本;
修改 podSubnet
,配置成 Calico 默认网段
- 查看并拉取镜像
# 查看所需镜像列表
kubeadm config images list --config kubeadm.yml
# 拉取镜像
kubeadm config images pull --config kubeadm.yml
-
master 初始化
执行以下命令初始化主节点,该命令指定了初始化时需要使用的配置文件,其中添加 --upload-certs 参数可以在后续执行加入节点时自动分发证书文件。追加的 tee kubeadm-init.log 用以输出日志。
kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log
-
再次查看 kebelet 状态
systemctl status kubelet
此时 kubelet 为 active,运行状态。 -
配置 kubelet
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config
- 验证是否安装成功
kubectl get node
此时节点的状态为 NotReady,这是由于我们还没部署任何网络插件,是正常的。
Node 节点安装
Node 节点只需要在安装 docker 的基础上安装 kubeadm
组件即可。
-
修改主机名
hostnamectl set-hostname kubernetes-node1
-
卸载原 kubeadm(若有):
yum remove -y kubelet kubeadm kubectl
-
安装 kubeadm:
yum install -y kubeadm
-
获取 join 命令(在 Master 节点执行)
kubeadm token create --print-join-command
kubeadm join 192.168.136.128:6443 --token bk1hs7.bxxz26xkzamtpn64 --discovery-token-ca-cert-hash sha256:a3ce56bb691c996e2b842ccfc08dbec834e295f30e582be0ca258500e02f49cc
Node2 节点安装过程略。。。
完成两个节点的 join 后可以在 master 节点查看节点状态,kubectl get nodes -o wide
至此 Node 节点都已经加入 Master。
安装网络插件 Calico
在 Master 节点使用命令 kubectl apply -f https://docs.projectcalico.org/v3.13/manifests/calico.yaml
进行 Calico 网络插件的安装。
安装完成后我们可以使用命令 kubectl get pods -n kube-system -o wide
查看 pod 状态。
再次查看 node 节点状态 kubectl get nodes -o wide
,发现处于 Ready 状态
这样我们整个 Kubernetes 集群已经搭建完成,大家可以开始部署你的服务应用了!
重新加入节点
若节点需要重新加入节点可以按照如下步骤进行:
-
先在 node 节点执行
kubeadm reset -f
命令,重置 kubeadm -
在 Master 节点删除原节点
kubectl delete node kubernetes-node1
-
在 Master 节点获取 join 命令
kubeadm token create --print-join-command
-
在 Node 节点执行命令重新加入集群
kubeadm join 192.168.136.128:6443 --token bk1hs7.bxxz26xkzamtpn64 --discovery-token-ca-cert-hash sha256:a3ce56bb691c996e2b842ccfc08dbec834e295f30e582be0ca258500e02f49cc
安装错误
在安装 Node 节点时可能会出现如下的错误
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
解决方法:
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
重启 Master 节点后执行 kubectl 相关命令出现如下错误,则很可能是没关闭 swap 导致 kubelet 无法正常启动,可以使用 free -m
命令查看
若 swap 所在行不为 0 则表示未关闭 swap,可以使用 swapoff -a
命令关闭,然后使用命令 systemctl start kubelet
重新启动 kubelet 。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于