[kubernetes]使用kubeadm和containerd摆设kubernetes

打印 上一主题 下一主题

主题 1001|帖子 1001|积分 3003

媒介

因宿主机内核版本限定和垂直伸缩特性的需要,安装的k8s版本为1.25,runtime为containerd,cni为calico。
containerd、kubeadm、kubelet也可以用包管理器来安装,因为不想配repo,也不想校验repo版有哪些区别,以是这几个都是用原生二进制方式安装的。
情况信息

IPHostnameOS VersionKernel VersionComment192.168.0.11node1centos 7.93.10control panel192.168.0.12node2centos 7.93.10worker node192.168.0.13node3centos 7.93.10worker node用到的组件版本信息

  • containerd: 1.7.21
  • k8s: 1.25.16
体系初始化

体系初始化步骤要求每个节点都要操作,一些主机名等信息需要根据实际修改。

  • 修改hostname,k8s要求每个节点的hostname不一样
  1. hostnamectl set-hostname node1
  2. hostnamectl set-hostname node2
  3. hostnamectl set-hostname node3
复制代码

  • (可选)假如没有dns可以让hostname之间直接访问,需要配置/etc/hosts
  1. 192.168.0.11 node1
  2. 192.168.0.12 node2
  3. 192.168.0.13 node3
复制代码

  • (可选)假如要长时间使用,最好配置一下时间同步。
  • 关闭swap。默认情况下,k8s检测到swap就会异常退出,导致node上的k8s启动失败。
  1. # 临时关闭。永久关闭需要修改 /etc/fstab
  2. swapoff -a
复制代码

  • 装载内核模块。假如不装载br_netfilter,下一步配置体系参数会报错。
  1. # 添加配置
  2. cat << EOF > /etc/modules-load.d/containerd.conf
  3. overlay
  4. br_netfilter
  5. EOF
  6. # 立即装载
  7. modprobe overlay
  8. modprobe br_netfilter
  9. # 检查装载。如果没有输出结果说明没有装载。
  10. lsmod | grep br_netfilter
复制代码

  • 配置体系参数。编辑/etc/sysctl.conf文件或/etc/sysctl.d/目录下的文件,添加或修改以下配置。编辑完成后实行sysctl -p使配置生效。(假如修改的是/etc/sysctl.d目录下的文件,sysctl -p需要指定文件名才能生效)
  1. net.ipv4.ip_forward=1
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. vm.swappiness = 0
复制代码

  • (可选)内核版本若高于4.1,可考虑使用ipvs来增强网络通讯性能
  • 安装依赖,否则安装containerd时,runc组件会有题目
  1. # conntrack-tools的版本为1.4.4-4.el7,如果低了可能会导致runc异常
  2. # 如果安装提示缺少依赖,而依赖在centos 7的repo源里没有,可从高版本centos、alma等发行版下载rpm包再安装
  3. yum install -y conntrack-tools
复制代码
安装containerd

  1. tar xf cri-containerd-cni-1.7.21-linux-amd64.tar.gz -C /
复制代码

  • 天生containerd的配置文件
  1. mkdir /etc/containerd
  2. containerd config default > /etc/containerd/config.toml
复制代码

  • 编辑containerd的配置文件/etc/containerd/config.toml,主要修改container的数据目录,并启用systemd的cgroup
  1. # 修改数据存储目录
  2. root = "/home/apps/containerd"
  3. # 对于使用systemd作为init system的linux发行版,官方建议用systemd作为容器cgroup driver
  4. # false改成true
  5. SystemdCgroup = true
复制代码

  • 重加载systemd配置,启动containerd
  1. systemctl daemon-reload
  2. systemctl start containerd
  3. systemctl enable containerd
复制代码

  • 简朴验证下containerd是否正常
  1. # 查看systemd status
  2. systemctl status containerd
  3. # 查看image,正常情况下还没有image
  4. crictl images
  5. # 验证runc是否正常,如果输出有报错,可以参考"系统初始化"的第8步"安装依赖"
  6. runc --version
复制代码
安装kubelet和kubeadm

本节步骤在全部k8s node都要操作。k8s的二进制文件安装包可以从github下载:https://github.com/kubernetes/kubernetes/releases
在changelog中找到二进制包的下载链接,下载server binary即可,里面包罗了master和node的二进制文件。

  • 解压下载好的压缩包,并将此中的二进制文件放到情况变量PATH目录下
  1. tar xf kubernetes-server-linux-amd64.tar.gz
  2. cd kubernetes/server/bin/
  3. find . -type f -perm /u+x -exec cp {} /usr/local/bin/ \;
复制代码

  • 新建或编辑kubelet的service文件 /usr/lib/systemd/system/kubelet.service
  1. [Unit]
  2. Description=kubelet: The Kubernetes Node Agent
  3. Documentation=https://kubernetes.io/docs/
  4. Wants=network-online.target
  5. After=network-online.target
  6. [Service]
  7. ExecStart=/usr/local/bin/kubelet
  8. Restart=always
  9. StartLimitInterval=0
  10. RestartSec=10
  11. [Install]
  12. WantedBy=multi-user.target
复制代码

  • 创建目录
  1. mkdir -p  /usr/lib/systemd/system/kubelet.service.d/
复制代码

  • 新建或编辑文件/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
  1. # Note: This dropin only works with kubeadm and kubelet v1.11+
  2. [Service]
  3. Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
  4. Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
  5. # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
  6. EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
  7. # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
  8. # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
  9. EnvironmentFile=-/etc/sysconfig/kubelet
  10. ExecStart=
  11. ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
复制代码

  • 启动kubelet
  1. systemctl enable --now kubelet
复制代码
创建集群

创建集群的步骤在control panel节点操作即可。

  • 初始化集群,这里主要指定k8s版本,可根据需求,参考kubeadm init --help提示配置初始化参数,比如pause镜像地址,pod ip范围等。
  1. kubeadm init --kubernetes-version v1.25.16
复制代码
假如init报错失败,可以查下containerd和kubelet的日志。失败后可以重置下kubeadm reset
  1. systemctl status containerd
  2. journalctl -xeu containerd
  3. systemctl status kubelet
  4. journalctl -xeu kubelet
复制代码
假如init成功,控制台会输出worker node参加cluster的下令,将这个下令粘贴到worker node实行即可,比如:
  1. kubeadm join 192.168.0.11:6443 --token 123456 \
  2.         --discovery-token-ca-cert-hash sha256:123456
复制代码
init成功后,输出还会提示创建kubeconfig,根据提示操作即可
  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config
复制代码

  • 配置网络插件。k8s需要cni插件才能让pod之间正常通讯,这里用的是calico插件
  1. # 下载配置文件。下载后可根据需求修改其中的image地址
  2. wget https://docs.projectcalico.org/manifests/calico.yaml
  3. # 部署calico
  4. kubectl apply -f calico.yaml
复制代码

  • 检查网络插件摆设效果。只有全部ready都为1/1才算成功
  1. kubectl get nodes
  2. kubectl get pod -n kube-system
复制代码
测试集群

摆设完成后,可以起个pod试下能否正常调度
  1. # 创建一个pod。nginx需要提前docker pull
  2. kubectl create deployment nginx --image=nginx
  3. # 暴露端口
  4. kubectl expose deployment nginx --port=80 --type=NodePort
  5. # 查看状态
  6. kubectl get pods,svc
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表