【集群】K8S集群搭建记录——简易单机集群
简介
- 组内师兄弟不小心把集群玩坏了,我们进行重装时遇到各种奇怪的报错,在此记录一下,避免下次遇到同样的情况浪费时间。
- 本次目标集群较为简单,仅由一台服务器组成。
- 整体根据[1]进行安装。
安装Docker
- 使用yum安装Docker
1
2docker_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
- 如果想在节点上查看运行中的Pod,可以使用kubelet提供的API接口:
集群初始化
- 创建并设置配置文件[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/configAlternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.confYou 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 | # 二选一,推荐calico |
网络参数问题
- 如果使用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分道扬镳后应当有新的安装方式,本次使用的强制降级方法不是很自然,后续有机会再更新新版安装方式
参考
[2] docker降级操作,20.10降级到19.03版本
- 标题: 【集群】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 进行许可。