体验istio(二):kubeadm安装k8s集群

这篇具有很好参考价值的文章主要介绍了体验istio(二):kubeadm安装k8s集群。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在这一篇中我们将使用kubeadm基于ubuntu22.04部署一个控制、工作节点分离的双节点集群用于测试,没有高可用加入,使用kubeadm的原因首先是它支持生产级部署,稳定性上没问题,而这里的测试环境也没有基础设施自动化相关的需求。注意,在部署k8s方面,官方文档已经非常详尽,此处不再做太多的细节说明,如果有细节问题请查看列出的官方参考,或者可以通过评论提出问题。

这里需要注意kubeadm的版本,它决定了k8s的版本,参考istio的Getting Started文档,里面指出了能够支持的k8s最新版本为1.28。所以我们的根参考文档是k8s1.28的文档:https://v1-28.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/,注意链接中的v1-28字样,博客中所有官方文档链接都是1.28版本的

如果你从k8s官网进入文档,记得在文档右上角切换版本:

体验istio(二):kubeadm安装k8s集群,云原生,kubernetes

准备

有两个节点:

  • m,master节点,运行控制面组件
  • w,worker节点,运行应用负载

基础环境

参考Before you begin,这里仅列出容易出现问题的点:

  • 最低配置为2c2g
  • 集群内机器hostname、mac、product_uuid唯一,k8s利用后两者标识不同的节点
  • 必须关闭swap,因为cgroupv1不支持swap,kubeadm虽然已经包含支持swap的beat特性但默认关闭,并且默认情况下它检测到使用swap会退出,实际上,swap是内存昂贵时代的解决方案,以降低服务质量(换入换出会对程序性能产生很大的影响)来换取可用性,但以当今的服务量级,服务质量下降可能带来其他更多的问题,所以大多数情况下都不建议开启swap,内存不够可以增加,也不必再关注swap内存回收的细节,感兴趣可以阅读为什么 Linux 需要 Swapping
  • 在每个节点安装容器运行时,在本系列第一篇中已经部署了contianerd

在后面的安装k8s集群部分还有一些准备工作。

安装kubeadm和组件

在每个节点安装kubeadm、kubelet,在需要命令行客户端的节点安装kubectl,参考Installing kubeadm, kubelet and kubectl,因为是全新安装所以不必关注k8s组件版本兼容规则,需要注意三点:

  • 安装istio支持的1.28版本,使用1.28版本文档中的命令就会安装1.28的最新修订版本
  • 为kubelet指定cgroup driver为systemd,与容器运行时保持一致
  • 别遗漏命令sudo apt-mark hold kubelet kubeadm kubectl以锁定版本,否则自动升级会带来比较大的风险。

以上步骤中不太清晰的是配置kubelet的cgroup driver,需要在m节点创建配置文件kubeadm-config.yaml并在kubeadm初始化时使用,这个文件会被kubeadm传递成为所有节点的/var/lib/kubelet/config.yaml文件,并会保存为kube-systemnamespace下的configmap对象。可以从Configuring the kubelet cgroup driver文档获取最小配置,已经修改kubernetesVersion

kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.28.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

使用配置文件的详细信息可以从Using kubeadm init with a configuration file文档中看到,如果执行命令kubeadm config print init-defaults可以看到输出中kubernetesVersion的值为1.28.0,虽然当前的实际版本是1.28.5

安装k8s集群

准备

主要是对网络、容器运行时和镜像的准备。

在本系列第一篇的基础环境部分介绍了测试环境的网络架构,在所有节点执行命令ip route show可以看到指向默认网关的接口为nat网络接口,kubeadm与其他k8s组件一样使用与默认网关关联接口的ip作为工作ip,对于这个ip的要求是:

  • 固定的ip,因为它会被自动写入到很多配置当中去
  • 节点间能够通过工作ip互通

网络配置文件/etc/netplan/00-installer-config.yaml示例:

# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:                    # 仅主机网络接口
      addresses:
        - 192.168.56.60/24
    enp0s8:                    # nat网络接口
      dhcp4: false             # 静态ip
      routes:                  # 默认网关
        - to: default
          via: 10.0.2.1
      addresses:
        - 10.0.2.51/24
      nameservers:             # dns
        addresses:
          - 8.8.8.8
  version: 2

另外,参考Troubleshooting kubeadm文档的Pods are not accessible via their Service IP部分可知,对于virtualbox,需要确保命令hostname -i能够返回一个路由可达的地址,具体的方法是将/etc/hosts文件中与主机名对应的127.0.0.1修改为该节点的工作ip,/etc/hosts部分示例:

127.0.0.1 localhost
10.0.2.51 ubuntu-dev60-k8sm1

执行命令kubeadm config images list可以看到kubeadm需要的镜像,其中pause镜像为registry.k8s.io/pause:3.9,所以需要执行命令sudo vim /etc/containerd/config.toml,修改配置文件中sandbox_image的值与之匹配。在本系列第一篇中已经为contianerd配置了对应仓库的mirror,kubeadm初始化时可以直接pull镜像,不用提前准备,当然也可以预先在每个节点执行命令sudo kubeadm config images pull拉取镜像,这样在初始化的时候能够更加快速的看到反馈。拉取至本地的镜像可以执行命令sudo crictl images list查看。

初始化控制平面m节点

在初始化控制平面节点之前,首先应该确定初始化命令的参数,之前已经为设置cgroup dirver准备了一个配置文件,不做高可用的话主要是考虑网络插件的诉求,此时所有节点上未添加cni插件配置,/etc/cni/net.d/目录为空

官方在Installing Addons文档中列出了不完全的网络插件列表,流行网络插件的对比可以参考rancher的文档CNI 网络插件,这里选择flannel,从项目主页可以看到它默认使用10.244.0.0/16作为pod cidr(包含在kube-flannel.yml文件中),插件的cidr必须与kubeadm中ClusterConfiguration中的对应设置保持一致,否则flannel pod无法启动。一个问题是flannel的默认cidr很容易看到,kubeadm却不容易(前面提到的打印初始化默认配置看不到),可以参考kubeadm Configuration (v1beta3)文档,其中的podSubnet配置对应kubeadm命令行参数--pod-network-cidr(文档中并没有提到两项配置的对应关系),可以看到其默认值是10.244.0.0/24,必须使之保持一致的话,修改哪一方都是可以的。还有一个问题,对于kubeadm来说参数--pod-network-cidr --config无法同时使用,否则会产生错误can not mix '--config' with arguments [pod-network-cidr]。这里选择在kubeadm-config.yaml中添加目前需要的配置,最终的配置内容为:

kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.28.0
networking:
  podSubnet: "10.244.0.0/16"
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

现在,在m节点执行初始化命令:

sudo kubeadm init --config kubeadm-config.yaml

当看到这样的输出信息时:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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 10.0.3.15:6443 --token b4ci5u.nwpagzl6cq4y035n \
        --discovery-token-ca-cert-hash sha256:cf300f9a479d5988c3d8a655530866d2abb69581812dae1626cad16dd3e381bb 

说明控制面节点已经初始化成功(不能等同于节点部署成功),接下来按照输出中提示的命令配置kubectl访问集群的凭证($HOME/.kube/config),完成后就可以执行命令kubectl get pods -A查看pod的状态。可以看到coredns pod因为网络插件未就绪而处于pending状态。接下来执行命令安装网络插件flannel,参考Deploying Flannel with kubectl,为避免网络缓慢,可以提前准备kube-flannel.yml文件:

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

flannel会在/etc/cni/net.d目录下创建网络配置。当看到所有的pod都处于running状态后,说明节点部署成功。

处理初始化失败

如果初始化过程失败,参考Clean up文档reset后再修复问题重新初始化,文档中命令假定root用户,如果用sudo提权,注意执行命令sudo sh -c "iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X"清理iptables,还有一些清理行为是包含在kubeadm命令输出中的,同样需要注意。

加入工作节点

现在可以在其他节点执行初始化打印中的join命令加入w节点了。

其余操作从Managed node labels开始根据情况自行处理即可,主要关注的是控制面节点隔离(禁止工作负载调度至控制面节点)。

安装容器管理工具kuboard

k8s的dashboard有些简陋,这里安装一个轻量的管理界面kuboard以简化对k8s的操作。参考安装 Kuboard v3 - 内建用户库,这里不使用docker,而是使用nerdctl(注意修改ip与挂载至容器的本地目录):

sudo nerdctl run -d \
  --restart=unless-stopped \
  --name=kuboard \
  -p 80:80/tcp \
  -p 10081:10081/tcp \
  -e KUBOARD_ENDPOINT="http://192.168.56.60:80" \
  -e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
  -v /home/ian/opt/kuboard/data:/data \
  eipwork/kuboard:v3

体验istio(二):kubeadm安装k8s集群,云原生,kubernetes

总结

虽然k8s的官方文档很详尽,但是想要一帆风顺也不容易。本篇因为没有使用高可用架构,相对简单一些,如果使用高可用,就需要使用一个负载均衡(例如kube-vip)来分发访问多个控制面节点的流量,更进一步的话可以把存储etcd集群放到外部(参考Options for Highly Available Topology)。

从部署过程可以看出,kubeadm无法自动化众多的准备工作,如果规模化使用,需要结合标准的操作系统镜像和ansible之类的自动化工具,可以尝试看看其他部署工具的方案。

k8s做了很多抽象,是一个复杂度很高的基础设施,在下一篇中会直接部署istio的demo应用,然后在下下篇中会对k8s相关的概念做一个整体的介绍,再然后才能谈得上体验istio。对于k8s,建议至少刷一遍官方文档。文章来源地址https://www.toymoban.com/news/detail-817547.html

到了这里,关于体验istio(二):kubeadm安装k8s集群的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云原生Kubernetes:Kubeadm部署K8S单Master架构

    目录 一、理论 1.kubeadm 2.Kubeadm部署K8S单Master架构 3.环境部署 4.所有节点安装docker 5.所有节点安装kubeadm,kubelet和kubectl 6.部署K8S集群 7.安装dashboard 8.安装Harbor私有仓库 9.内核参数优化方案 二、实验 1.Kubeadm部署K8S单Master架构 2. 部署流程  3.环境部署 4.所有节点安装docker 5.所有节

    2024年02月10日
    浏览(61)
  • Kubernetes(K8s)使用 kubeadm 方式搭建多 master 高可用 K8s 集群

    本篇主要针对上篇文章的单 master 节点的 K8s 集群上搭建多 master 节点集群 和 LB 负载均衡服务器。 Kubernetes(K8S)集群搭建基础入门教程 虚拟机 IP 地址: IP 操作系统 主机名称 192.168.2.121 centos7.9 k8s-master01 192.168.2.124 centos7.9 k8s-master02 192.168.2.125 centos7.9 k8s-node01 192.168.2.126 centos

    2023年04月26日
    浏览(52)
  • Kubernetes技术--使用kubeadm快速部署一个K8s集群

    这里我们配置一个 单master集群 。( 一个Master节点,多个Node节点 ) 1.硬件环境准备 一台或多台机器,操作系统 CentOS7.x-86_x64 。这里我们使用安装了CentOS7的三台虚拟机 硬件配置 : 2GB或更多RAM , 2个CPU或更多CPU , 硬盘30GB或更多 2.主机名称和IP地址规划 3. 初始化准备工作 (1).关

    2024年02月10日
    浏览(58)
  • 云原生|kubernetes|kubernetes集群部署神器kubekey安装部署高可用k8s集群(半离线形式)

    前面利用kubekey部署了一个简单的非高可用,etcd单实例的kubernetes集群,经过研究,发现部署过程可以简化,省去了一部分下载过程(主要是下载kubernetes组件的过程)只是kubernetes版本会固定在1.22.16版本,etcd集群可以部署成生产用的外部集群,并且apiserver等等组件也是高可用,

    2024年02月15日
    浏览(50)
  • 【Kubernetes部署篇】Kubeadm方式搭建K8s集群 1.27.0版本

    官方文档: 二进制下载地址 环境规划: pod网段:10.244.0.0/16 service网段:10.10.0.0/16 注意: pod和service网段不可冲突,如果冲突会导致K8S集群安装失败。 主机名 IP地址 操作系统 master-1 16.32.15.200 CentOS7.8 node-1 16.32.15.201 CentOS7.8 node-2 16.32.15.202 CentOS7.8 1、关闭防火墙 2、配置域名解

    2024年02月08日
    浏览(78)
  • 【Kubernetes部署篇】Kubeadm方式搭建K8s集群 1.26.0版本

    官方文档: 二进制下载地址 环境规划: pod网段:10.244.0.0/16 service网段:10.10.0.0/16 注意: pod和service网段不可冲突,如果冲突会导致K8S集群安装失败。 容器运行时本次使用containerd。 主机名 IP地址 操作系统 master-1 16.32.15.200 CentOS7.8 node-1 16.32.15.201 CentOS7.8 node-2 16.32.15.202 CentOS

    2024年02月10日
    浏览(47)
  • 云原生Kubernetes: Kubeadm部署K8S 1.29版本 单Master架构

    目录 一、实验 1.环境 2.K8S master节点环境准备 3.K8S master节点安装kubelet、kubeadm、kubectl 3.K8S node节点环境准备与软件安装 4.K8S master节点部署服务 5.K8S node节点部署 6.K8S master节点查看集群 7.容器网络(CNI)部署 8.K8S 集群测试 二、问题 1.calico生成资源报错 2.为何要安装docker和ci-d

    2024年02月01日
    浏览(70)
  • Kubernetes技术--使用kubeadm搭建高可用的K8s集群(贴近实际环境)

    1.高可用k8s集群架构(多master) 2.安装硬件要求 一台或多台机器,操作系统 CentOS7.x-86_x64 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多 注: 这里属于教学环境,所以使用三台虚拟机模拟实现。 3.部署规划 4.部署前准备 (1).关闭防火墙 (2).关闭selinux (3).关闭swap (4).根据规

    2024年02月10日
    浏览(45)
  • 一、kubeadm部署Kubernetes(k8s) 1.23.0多主高可用集群

    Kubernetes介绍 kubernetes(k8s)是2015年由Google公司基于Go语言编写的一款开源的容器集群编排系统,用于自动化容器的部署、扩缩容和管理; kubernetes(k8s)是基于Google内部的Borg系统的特征开发的一个版本,集成了Borg系统大部分优势; 官方地址:https://Kubernetes.io 代码托管平台:

    2024年03月25日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包