k8s系列文章二:集群配置

一、关闭交换分区

python 复制代码
# 临时关闭分区
swapoff -a
# 永久\关闭自动挂载swap分区
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

二、修改cgroup管理器

ubuntu 系统,debian 系统,centos7 系统,都是使用 systemd 初始化系统的。systemd 这边已经有一套 cgroup 管理器了,如果容器运行时和 kubelet 使用 cgroupfs,此时就会存在 cgroups 和 systemd 两种 cgroup 管理器。也就意味着操作系统里面存在两种资源分配的视图,当操作系统上存在 CPU,内存等等资源不足的时候,操作系统上的进程会变得不稳定!

  1. 编辑文件/etc/docker/daemon.json
python 复制代码
{
  "exec-opts": [
    "native.cgroupdriver=cgroupfs"  # 可取值cgroupfs、systemd
  ], 
  "registry-mirrors": ["https://yne6emhg.mirror.aliyuncs.com"]  # 改成自己的加速地址,当然没有的话也可以不配置,最多加速效果跟平时一样
}

2.配置生效

python 复制代码
# 重启docker的伴随线程
sudo systemctl daemon-reload
# 重启docker
systemctl restart docker

3.解释一下阿里源库加速,省的朋友们到处找了(不配置加速的朋友,不用理会,哈哈哈)

三、CNI配置

python 复制代码
cat << EOF | tee /etc/cni/net.d/10-containerd-net.conflist
{
 "cniVersion": "1.0.0",
 "name": "containerd-net",
 "plugins": [
   {
     "type": "bridge",
     "bridge": "cni0",
     "isGateway": true,
     "ipMasq": true,
     "promiscMode": true,
     "ipam": {
       "type": "host-local",
       "ranges": [
         [{
           "subnet": "10.88.0.0/16"
         }],
         [{
           "subnet": "2001:db8:4860::/64"
         }]
       ],
       "routes": [
         { "dst": "0.0.0.0/0" },
         { "dst": "::/0" }
       ]
     }
   },
   {
     "type": "portmap",
     "capabilities": {"portMappings": true},
     "externalSetMarkChain": "KUBE-MARK-MASQ"
   }
 ]
}
EOF

四、初始化镜像配置

默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址

  • 两种安装方式,任选其一
  • 方式一:自动安装
python 复制代码
# 调用可选参数image-repository


# 查看默认镜像列表
kubeadm config images list
# 查看镜像地址调整为阿里源后的列表
kubeadm config images list  --image-repository registry.aliyuncs.com/google_containers
# 安装阿里源镜像
kubeadm config images pull  --image-repository registry.aliyuncs.com/google_containers
  • 方式二:手动安装

如果k8s的版本是1.24后的版本,选用如下形式安装镜像

python 复制代码
# 查看所需镜像并写入txt文件中
kubeadm config images list > 1.txt


# 测试安装镜像
ctr images pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
# 本地镜像打标签,其中n代表namespace,i代表images
ctr -n k8s.io i tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6


# 正式环境应用,安装全部
# Ⅰ筛选1.txt中"registry.k8s.io/"内容并剔除
# Ⅱ执行安装命令
cat 1.txt |xargs -I {} ctr images pull registry.cn-hangzhou.aliyuncs.com/google_containers/{}


# 查看已安装
crictl img

如果k8s的版本是1.24前的版本,选用如下形式安装镜像

python 复制代码
# 查看所需镜像并写入txt文件中
kubeadm config images list > 1.txt


# 测试安装组件镜像kube-apiserver
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.28.3


# 正式环境应用,安装全部
# Ⅰ筛选1.txt中"registry.k8s.io/"内容并剔除
# Ⅱ执行安装命令
cat 1.txt |xargs -I {} docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/{}


# 查看已安装
docker images

五、初始化集群

启动命令

kubeadm init

六、再初始化集群

  • 第四步初始化肯定失败了?①容器container配置;②镜像库用的registry.k8s.io。①②需外网
  • containerd是docker的子项目,但是现在已经独立出去了
  • kubeadm在版本1.24之后的k8s管理中移除了对docker集成,反而使用了containerd

6.1、容器container配置

python 复制代码
# 生成 containerd 的默认配置文件,后缀名一定是toml,不要质疑,因为我尝试过!
containerd config default > config.toml


# 查看 sandbox 的默认镜像仓库在文件中的第几行
cat config.toml | grep -n "sandbox_image"


# 编辑config.toml,定位到 sandbox_image,将 仓库地址修改成阿里源
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
# 效果同上,只是地址稍微换了下
# sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8"


# 将文件移动到默认路径
mkdir /etc/containerd
mv config.toml /etc/containerd/config.toml

重载containerd服务

systemctl daemon-reload

systemctl restart containerd.service

6.2、镜像库配置

python 复制代码
# 生成 默认的初始化配置文件
kubeadm config print init-defaults > init-default.yaml


# 查看默认镜像库
cat init-default.yaml | grep imageRepository

 
# 编辑init-default.yaml

# 将默认的镜像仓库registry.k8s.io修改成阿里源registry.aliyuncs.com/google_containers
sed -i 's#registry.k8s.io#registry.aliyuncs.com/google_containers#' init-default.yaml

# 将master主机信息advertiseAddress: 1.2.3.4中的ip地址改成master主机实际地址172.21.1.254
sed -i 's#advertiseAddress: 1.2.3.4#advertiseAddress: 172.21.1.254#' init-default.yaml


# 将文件移动到默认地址
mv init-default.yaml /etc/kubernetes/init-default.yaml

6.3、在初始化ING

  • 两种启动方式,任选其一
  • ①加载配置文件并启动

此时,host主机信息存储在/etc/hosts,k8s基础信息在/etc/kubernetes/init-default.yaml中

kubeadm init --config=/etc/kubernetes/init-default.yaml

  • ②命令行启动

kubeadm init:在主节点初始化 Kubernetes 控制平面节点。

  • --image-repository registry.aliyuncs.com/google_containers:使用阿里云镜像仓库
  • --kubernetes-version=v1.28.2:指定kubernetes版本,查询命令kubelet --version;
  • --pod-network-cidr=10.244.0.0/16:指定pod的网段,与下面部署的CNI中保持一致 ;
  • --service-cidr=10.96.0.0/12:机器内部虚拟网络,Pod统一访问入口
  • --apiserver-advertise-address=172.21.1.254:指定master主机地址;
python 复制代码
# 可以看到,提供的参数其实是可以替代<<5.2>>步骤,好处?自然是定制化书写方便咯!
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.2(你的版本) --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=172.21.1.254(你的IP地址)

6.4、结果分析

  • kubelet-start 生成kubelet的配置文件"/var/lib/kubelet/config.yaml"
  • certificates生成相关的各种证书
  • kubeconfig生成相关的kubeconfig文件
  • bootstraptoken生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到

6.5、查看k8s日志

python 复制代码
# 查看kubelet日志,其中-f是 --follow, -u是过滤出kubelet日志
journalctl -f -u kubelet

# 查看kubelet日志,也可以用如下命令,一样的
journalctl -xeu kubelet

七、配置kube-config

  • Node是K8s集群中的一个工作节点,可以是物理机或虚拟机。Node上kubelet进程负责管理Pod生命周期。拥有唯一符NodeName

  • Pod是Kubernetes中最小的可部署单元,通常包含一个或多个容器。Pod在Node上运行,共享相同的网络命名空间和存储卷。Pod也有一个唯一的标识符,称为PodName。

  • Node和Pod之间的关系是一对多的关系,即一个Node上可以运行多个Pod,但一个Pod只能运行在一个Node上

  • 查看节点状态

  • 使kubectl与集群通信
python 复制代码
# 通信
mkdir -p $HOME/.kube 
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

查看节点状态

八、令牌概念

  • 令牌的用意是为了方便节点的加入
  • 令牌的获取方式有如下四种方式,任取其一皆可
  1. 初始化控制平面节点时,kubeadm init命令会打印出加入令牌:
python 复制代码
kubeadm init
...
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
  1. 在控制平面节点的/etc/kubernetes/目录下找到生成的token文件,内容即为加入令牌。

  2. 使用kubeadm token list命令查看当前有效的加入令牌。

  3. 如果集群配置错误,可以使用kubeadm reset删除集群,重新执行kubeadm init来初始化集群启动并以此获取新令牌。注,可以配置-r --cri-socket=/var/run/containerd/containerd.sock来实现主机上pod的删除

  4. 若令牌过期(默认24h),可使用命令kubeadm token create --print-join-command生成新令牌

九、将子节点加入集群

  • 一定需要在子节点上运行

  • 其中token(即上一章提到的令牌)可通过kubeadm token list

python 复制代码
# 加入集群命令
kubeadm join <Master节点ip>:6443 --token <生成的Token> --discovery-token-ca-cert-hash sha256:<Kubelte Init时生成的hash>

十、安装Pod网络插件

例如Calico或Flannel:

python 复制代码
# calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml --no-check-certificate
# 应用启动网络容器flannel
kubectl apply -f kube-flannel.yml

十一、查看集群

python 复制代码
kubectl get nodes
kubectl get pods --all-namespaces
kubectl get pods -n kube-system

十二、dashboard可视化

  • PASS

十三、引申

十四、结束!

相关推荐
阿里云云原生5 小时前
不改代码也能监控 AI Agent?揭秘 OBI 如何在内核层精准解析 GenAI 语义流量
云原生·agent
众人皆醒我独醉5 小时前
Pod 一直 Terminating,死活删不掉?三个凶手,每一个你都意想不到
面试·kubernetes
飞翔沫沫情6 小时前
K8s Alloy 采集 Pod 控制台日志
云原生·容器·kubernetes
潮起鲸落入海12 小时前
Kubernetes Metric Server, Quota and Limits
容器·kubernetes
梦想的颜色12 小时前
Docker 容器化本地部署 Claude Code 完整硬核教程|隔离沙盒 + 国产模型直连 + 持久化 Skill
运维·容器·ai 工程化·沙盒隔离·docker 本地部署·claude code硬核实战·国内国产模型接入
摇滚侠13 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 19-25
java·云原生·kubernetes
渣渣盟13 小时前
Docker 运维常用命令手册(含扩容与实战)
运维·docker·容器
我叫张小白。14 小时前
一个微服务电商+社区项目(瓷韵app)的技术深度复盘
docker·微服务·云原生·架构
咕噜咕噜的猪大侠15 小时前
《K8s 核心知识梳理:Deployment 滚动更新、JobCronJob、DaemonSet 和 Service》
云原生·容器·kubernetes
虚心的百褶裙15 小时前
远程调用服务架构设计及zookeeper技术详解(下篇)
分布式·zookeeper·云原生