Kubernetes集群部署实操

共计 5882 个字符,预计需要花费 15 分钟才能阅读完成。

k8s 架构和核心概念

Kubernetes 集群部署实操

主控制节点组件

主控制节点组件对集群做出全局决策 (比如调度),以及检测和响应集群事件 (例如,当不满足部署的 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_netfilterEOF​cat <<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 进程号 

 

正文完
 4
caoguojian
版权声明:本文于2024-09-27转载自参考文档:,共计5882字。
转载提示:此文章非本站原创文章,若需转载请联系原作者获得转载授权。
一言一句话
-「
评论(没有评论)