【集群】K8S集群搭建记录——简易单机集群

【集群】K8S集群搭建记录——简易单机集群

Fre5h1nd Lv5

简介

  • 组内师兄弟不小心把集群玩坏了,我们进行重装时遇到各种奇怪的报错,在此记录一下,避免下次遇到同样的情况浪费时间。
  • 本次目标集群较为简单,仅由一台服务器组成。
  • 整体根据[1]进行安装。

安装Docker

  • 使用yum安装Docker
    1
    2
    docker_version=20.10.5  # 根据自己需要可设置为其他版本
    yum install docker-ce-${docker_version} -y

细节问题

  • 由于本机已有Docker环境故跳过了这一步,但得到报错:

    [WARNING Service-Docker]: docker service is not enabled, please run ‘systemctl enable docker.service’
    [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 23.0.4. Latest validated version: 20.10

  • 显然是Docker版本过高(可能是由于K8S和Docker近期分道扬镳有关,故对Docker版本进行降级[2]
    1
    2
    3
    4
    $ docker_version=20.10.5  # 根据自己需要可设置为其他版本
    $ yum downgrade --setopt=obsoletes=0 -y docker-ce-${docker_version} docker-ce-selinux-${docker_version} # 安装Docker

    $ systemctl enable docker.service # 安装完成后启动Docker服务

安装kubelet、kubeadm、kubectl

  • 使用yum安装K8S组件
    1
    2
    3
    4
    5
    $ k8s_version=1.23.6  # 根据自己需要可设置为其他版本
    $ yum install -y kubelet-${k8s_version} kubeadm-${k8s_version} kubectl-${k8s_version} --disableexcludes=kubernetes # disableexcludes参数禁止了除了该仓库外的其他仓库

    $ systemctl enable --now kubelet # 安装完成后启动kubelet服务
    $ systemctl start kubelet

细节问题

  • 正常安装后一直卡在其中一步,得到信息:

    [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory “/etc/kubernetes/manifests”. This can take up to 4m0s
    [kubelet-check] Initial timeout of 40s passed.

  • 根据[3]确认和前面Docker一样是版本问题(发现该问题之前安装组件并未指定版本),对相关组件进行降级:
    1
    2
    3
    $ yum remove -y kubelet kubeadm kubectl
    $ k8s_version=1.23.6 # 根据自己需要可设置为其他版本
    $ yum install -y kubelet-${k8s_version} kubeadm-${k8s_version} kubectl-${k8s_version} # 安装组件

知识补充

  • kubelet, kubeadm, kubectl是Kubernetes的三个基本工具,它们分别有以下作用:

    • kubelet是运行在每个节点上的代理,它负责管理本机的容器,保证容器都运行在Pod中。kubelet还负责维护容器的生命周期,以及管理存储和网络资源。kubelet会定期向控制平面汇报节点的状态和资源使用情况。
    • kubeadm是一个用于快速部署Kubernetes集群的工具。kubeadm可以通过简单的命令来初始化集群、添加节点、升级集群等。kubeadm会执行一系列的操作,如生成证书、配置kubeconfig文件、启动控制平面组件、安装网络插件等。
    • kubectl是一个用于与Kubernetes集群交互的命令行工具。kubectl可以用来管理集群本身,以及在集群上部署和运维容器化应用。kubectl支持多种操作,如创建、删除、更新、查看资源对象,执行命令,查看日志等。
  • 一些具体的例子:

    • 如果想在节点上查看运行中的Pod,可以使用kubelet提供的API接口:curl -s http://localhost:10255/pods | jq .items[].metadata.name
    • 如果想在主节点上初始化一个集群,可以使用kubeadm init命令:kubeadm init --apiserver-advertise-address=192.168.0.10 --pod-network-cidr=10.244.0.0/16
    • 如果想在工作节点上加入一个集群,可以使用kubeadm join命令:kubeadm join 192.168.0.10:6443 --token abcdef.1234567890abcdef --discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
    • 如果想在集群上创建一个Deployment对象,可以使用kubectl create命令:kubectl create deployment nginx --image=nginx
    • 如果想在集群上查看所有的节点,可以使用kubectl get命令:kubectl get nodes

集群初始化

  • 创建并设置配置文件[4]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ kubeadm config print init-defaults > kubeadm-config.yaml
    $ vim kubeadm-config.yaml
    localAPIEndpoint:
    advertiseAddress: 1.2.3.4 # 修改为本机ip,对应 --apiserver-advertise-address
    nodeRegistration:
    name: node # 修改为本机hostname(使用hostname命令查看)
    imageRepository: registry.aliyuncs.com/google_containers # 修改为国内源
    networking:
    serviceSubnet: 10.96.0.0.1/12 # 猜测与 --service-cidr对应 //TODO
    podSubnet: 10.100.0.1/24 # 对应 --pod-network-cidr
  • 初始化集群
    1
    2
    3
    4
    5
    $ kubeadm init \
    --config kubeadm-config.yaml \
    --ignore-preflight-errors=Swap \
    --upload-certs | \
    tee kubeadm-init.log # 初始化集群
    • --upload-certs:可以在后续执行加入节点时自动分发证书文件
    • tee kubeadm-init.log:输出日志
  • 初始化成功或后获得信息:

    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 x.x.x.x:6443 –token abcdef.0123456789abcdef \
    –discovery-token-ca-cert-hash sha256:b45c9d150ca4a2f658b8316ae0246844733cafb36ed2883b3fd4be5e7fd554e8

  • 根据信息配置:
    1
    2
    3
    4
    5
    $ 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" >> ~/.bashrc
    $ source ~/.bashrc

补充

  • 上述信息中提及修改path的多种方式,如果希望对所有系统用户永久生效,将上述最后两行替换为指令重新执行:[5]
    1
    2
    $ echo -e "\n#k8s\nexport KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
    $ source /etc/profile

安装网络插件

1
2
3
4
5
# 二选一,推荐calico
# calico
$ kubectl create -f https://docs.projectcalico.org/archive/v3.21/manifests/calico.yaml
# flannel
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

网络参数问题

  • 如果使用flannel网络插件,必须指定–pod-network-cidr配置选项,否则名为coredns-xxxxxxxxxx-xxxxx的Pod无法启动,一直处于ContainerCreating状态,查看详细信息,可见类似如下错误信息:[6]

    networkPlugin cni failed to set up pod “coredns-7f89b7bc75-9vrrl_kube-system” network: open /run/flannel/subnet.env: no such file or directory

  • 因为太麻烦,最后决定更换为Calico网络插件[7]

修改kube-controller-manager参数

  • 某些情况下会希望修改kube-controller-manager参数,使用以下方法进行修改:
    1
    2
    3
    4
    5
    $ vim /etc/kubernetes/manifests/kube-controller-manager.yaml
    ...
    进行相应修改
    ...
    $ systemctl restart kubelet

环境汇总

CentOS Linux release 7.9.2009 (Core)
docker_version=20.10.5
k8s_version=1.23.6

其他

  • 后续可能会有复杂集群搭建的问题,到时候再继续记录复杂版本
  • 理论上K8S和Docker分道扬镳后应当有新的安装方式,本次使用的强制降级方法不是很自然,后续有机会再更新新版安装方式

参考

[1] Centos安装部署Kubernetes(K8s)

[2] docker降级操作,20.10降级到19.03版本

[3] k8s初始化报错[kubelet-check] Initial timeout of 40s passed.

[4] 使用kubeadm部署Kubernetes集群实践

[5] CentOS 添加环境变量的三种方法

[6] Kubernetes 使用kubeadm创建集群

[7] Kubernetes 安装网络插件(calico)

  • 标题: 【集群】K8S集群搭建记录——简易单机集群
  • 作者: Fre5h1nd
  • 创建于 : 2023-05-22 11:33:28
  • 更新于 : 2024-03-08 15:36:43
  • 链接: https://freshwlnd.github.io/2023/05/22/k8s/k8s-install/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论