共计 5882 个字符,预计需要花费 15 分钟才能阅读完成。
k8s 架构和核心概念

主控制节点组件
主控制节点组件对集群做出全局决策 (比如调度),以及检测和响应集群事件 (例如,当不满足部署的 replicas 字段时,启动新的 pod)。主控制节点组件可以在集群中的任何节点上运行。然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有主控制节点组件,并且不会在此计算机上运行用户容器。
- apiserver 主节点上负责提供 Kubernetes API 服务的组件,它是 Kubernetes 控制面的前端组件。对外通信 work node 都是通过 api-server
- etcoetcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。Yaml,配置信息
- kube-scheduler 主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件 / 软件 / 策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。
- kube-controller-manager 在主节点上运行控制器的组件。从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。这些控制器包括:1. 节点控制器 (Node Controller) : 负责在节点出现故障时进行通知和响应。2. 副本控制器 (Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。3. 终端控制器 (Endpoints Controller) : 填充终端 Endpoints) 对象 (即加入 Service 与 Pod)。4. 服务帐户和令牌控制器 (Service Account & Tken Controllers),为新的命名空间创建默认帐户和 API 访问令牌。
从节点组件
节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境
- kubelet 一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。接受来自 master 请求。
kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSoecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。
- kube-proxykube-proxy 是集群中每个节点上运行的网络代理实现 Kubernetes Service 概念的一部分 kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
- 容器运行时 (Container Runtime) 容器运行环境是负责运行容器的软件。Kubernetes 支持多个容器运行环境: Docker、containerd、cri-o、rktlet 以及任何实现 KubernetesCRI (容器运行环境接口)。
插件 (Addons)
- DNS 尽管其他插件都并非严格意义上的必需组件,但几乎所有 Kubernetes 集群都应该有集群 DNS,为很多示例都需要 DNS 服务。
- Web 界面 (仪表盘)Dashboard 是 Kubernetes 集群的通用的、基于 Web 的用户界面。它使用户可以管理集群中运行的应用程序以及集群本身并进行故障排除。
- 容器资源监控容器资源监控 将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中,并提供用于浏览这些数据的界面。
- 集群层面日志焦群层面日志 机制负责将容器的日志数据 保存到一个集中的日志存储中,该存储能够提供搜索和汶览接口。
安装部署
部署目标
在所有节点上安装 Docker 和 kubeadm,kubelet 部署容器网络插件 flannel
部署架构
192.168.99.101 Centos7.9 master 主节点
192.168.99.102 Centos7.9 node1 从节点 1
192.168.99.103 Centos7.9 node2 从节点 2
三台节点安装的软件 root 账号
Docker Kubeadm kubelet kubectl flanne
安装基础软件
每个节点都需要安装
添加基础软件
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoyum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools ntp git
同步系统时间
ntpdate 0.asia.pool.ntp.org
设置阿里云 docker,k8s 的 yum 源
cat >>/etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
查看仓库中所有 docker 版本
yum list docker-ce --showduplicates | sort -r
安装 docker
yum install docker-ce-19.03.11 -y
设置阿里云的镜像加速
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
EOF
启动并加入开机启动
systemctl start dockersystemctl enable docker
关闭防火墙
PS:如果使用云服务器,还需要在云服务器的控制台中把防火墙关闭了或者允许所有端口。
systemctl stop firewalldsystemctl disable firewalld
关闭 SELinux
这样做的目的是:为了让容器能读取主机文件系统。
setenforce 0
# 临时 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
永久关闭 swap 分区交换,kubeadm 规定,一定要关闭
swapoff -a
#临时 yes | cp /etc/fstab /etc/fstab_bak
iptables 配置
cat <<EOF | sudo tee /etc/modules-load.d/k8s.confbr_netfilterEOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsudo sysctl --system
安装 kubeadm kubelet kubectl
修改 docker 配置文件 使用 systemd 作为 cgroup 的驱动
查看 Docker 的启动引擎:
docker info | grep Cgroup
新建 /etc/docker/daemon.json 文件,添加以下内容
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
重启 docker 服务
systemctl daemon-reloadsystemctl restart docker
安装 kubelet kubeadm kubectl。
ps: 基于 Kubernetes1.29.3 版本搭建,安装 kubeadm kubectl 需要指定这个版本。
yum install -y kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3
设置开机自启
systemctl enable kubelet
初始化 Master 节点
设置管理节点 主机名
hostnamectl set-hostname master
初始化 master 节点
work node 只需要 job,不需要 init。
ps:如果是云服务器需要把 apiserver-advertise-address 改成主节点的内网 ip
kubeadm init --kubernetes-version=1.19.3 \--apiserver-advertise-address=192.168.1.36 \--image-repository registry.aliyuncs.com/google_containers \--service-cidr=10.1.0.0/16 \--pod-network-cidr=10.244.0.0/16
保存 token 信息,word node 节点需要用到,加入集群中
根据提示执行以下命令,识别 api token 地址 serverapp 地址
mkdir -p $HOME/.kubesudo
cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo
chown $(id -u):$(id -g) $HOME/.kube/config
配置 kubeconfig 环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
安装网络插件 Flannel,下载一个代码库使用里面的 yaml,也可也其他方式安装
git clone https://git.imooc.com/coding-464/kubeblog.gitkubectl apply -f kubeblog/docs/Chapter4/flannel.yaml
查看所有 pod 是否都运行 kubectl get po -n kube-system如果 coredns 无法启动可以手动启动:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Work node- 节点加入集群
按照之前安装 Master 节点的步骤,安装 kubeadm,kubectl, kubelet。
kubectl get node
显示 master 节点并且 master 节点是 ready 状态 之后。
work node 节点执行 kubeadm join 命令 (之前保存的命令)。
或者在 master 节点,重新生成新的 token,拿到新的 token 后去 work node 上执行
kubeadm join
ps:toker 有效期为 24 小时。
kubeadm token create --print-join-command
踩坑:
1、node 节点执行 kubectl get node 报错
把 master 节点的 admin.conf 拷贝到 node 上就行
scp /etc/kubernetes/admin.conf root@node1:/etc/kubernetes/
然后在 node 节点配置 kubeconfig 环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profilesource ~/.bash_profile
2、node 节点加入集群后 flannel 组件报错了
解决办法:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
常用命令
查看 kube-system 这个 namespace 下的 pod,-o wide 选项可以显示更多信息,包括 node 节点的 IP 地址和节点的地理位置。
kubectl get pods -o wide -n kube-system
查看 pod 的 yaml 问题
kubectl get pod kube-flannel-ds-hh9dx -n kube-system -o yaml
查看 pod 详情 pod 后面跟上 pod name,不加 -n kube-system 会默认使用 default 命名空间
kubectl describe pod kube-flannel-ds-hh9dx -n kube-system
查看 pod 日志,查看 name 为 kube-flannel-ds-lzmkk 的 pod 日志
kubectl logs kube-flannel-ds-lzmkk -n kube-system
查看 node 日志
journalctl -f -u kubelet
如果需要重新部署删除 node 节点需要执行一下命令
kubectl drain <node name> --delete-local-data --force --ignore-daemonsetskubectl delete node <node name>kubeadm reset #清理环境
使用以下命令可以获取 Kubernetes API 服务器的地址
kubectl cluster-info | grep 'Kubernetes master' | awk '/http/ {print $NF}'
使用以下命令可以获取 Kubernetes 集群的名称
kubectl config view -o jsonpath='{.clusters[].name}' | head -n 1
获取 flannel DaemonSet 的名称
kubectl get ds
然后使用 kubectl edit ds <daemonset-name> 命令编辑该 DaemonSet 的 YAML 文件
kubeadm 创建的 yaml 文件路径 /etc/kubernetes/manifests
查看 kube-system 命名空间下的 ConfigMap 列表
kubectl get configmap -n kube-system
查看 kubeadm-config 的 ConfigMap 配置项
kubectl describe configmap kubeadm-config -n kube-system
Linux 进程常用命令
根据端口查进程
lsof -i :8080
查看进程详细信息
ps -ef | grep 进程号
杀死进程
kill -9 进程号