K8s集群搭建及相关问题
任意节点访问 http://192.168.75.128:80 均可,用户名:admin,密码:Kuboard123。(2) 填入集群名称、IP和token等信息,将集群导入Kuboard;(注意:此时先不要将slave节点加入集群,因为还未配置flannel实现各节点网络通信!查看原因(注意:此处具体问题有很多,大家可以根据实际情况寻找不同的解决方案),发现以下问题。,不然加入集群时可能会出现后
目录
四、选取master节点,安装初始化(只在master节点配置)
九、Kubesphere(集群管理可视化工具三,k8s v1.21.x版本之前适用)
本文参考文章如下,首先在此感谢各位大佬写的文章!!!
在ubuntu18.04上安装和使用k8s集群_ubuntu root@master:/home/zzp# pdsh -w node1,node2 -CSDN博客
Ubuntu 18.04搭建kubernetes集群 - 知乎 (zhihu.com)
Kubeadm初始化遇到的坑:ERROR CRI: container runtime is not running:-CSDN博客
kubernetes新版本使用kubeadm init的超全问题解决和建议_this version of kubeadm only supports deploying cl-CSDN博客
kubernetes - 解决k8s执行kubeadm join遇到could not find a JWS signature的问题 - 个人文章 - SegmentFault 思否
k8s安装flannel报错“node "master" pod cidr not assigned” - 自然洒脱 - 博客园 (cnblogs.com)
Kubernetes 1.27.4 Kubernetes-Dashboard 安装_kubernetes-dashboard镜像下载-CSDN博客
一、安装docker
apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
apt update && apt install docker-ce
docker run hello-world
若执行第一句时报错:
E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
解决方法:
# 查看apt相关进程,并kill掉
ps -e | grep apt
# 再执行以下命令即可
sudo rm /var/lib/dpkg/lock-frontend && sudo rm /var/cache/apt/archives/lock && sudo rm /var/lib/dpkg/lock
二、安装k8s
2.1 关闭虚拟内存
sudo swapoff -a #暂时关闭
vim /etc/fstab #永久关闭,注释掉swap那一行,推荐永久关闭
2.2 安装kubernetes
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install kubelet kubeadm kubectl kubernetes-cni
2.3 设置开机启动
sudo systemctl enable kubelet && systemctl start kubelet
2.4 查看kubectl版本
kubectl version
三、配置各节点网络
# 修改 /etc/hosts文件,使其相互ping通
vim /etc/hosts
# 在后面添加以下内容:
192.168.75.128 master
192.168.75.129 slave01
192.168.75.130 slave02
(注意:本文图片中主机名可能出现master和master-virtual-mechine,其实均为master,请大家不要在意!)
四、选取master节点,安装初始化(只在master节点配置)
4.1 查看需要的镜像及其版本
kubeadm config images list
4.2 创建docker脚本拉取镜像
# 创建docker脚本
vim pull_k8s_images.sh
# 将以下内容添加到脚本文件(begin至end部分)
# ----------begin-----------
set -o errexit
set -o nounset
set -o pipefail
##定义版本,版本号与 kubeadm config images list 命令中的仓库相对应
KUBE_VERSION=v1.28.8
KUBE_PAUSE_VERSION=3.9
ETCD_VERSION=3.5.9-0
##原始仓库,与 kubeadm config images list 命令中的仓库相对应
GCR_URL=registry.k8s.io
##使用国内镜像仓库
DOCKERHUB_URL=registry.aliyuncs.com/google_containers
##镜像列表
images=(
kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
)
##拉取并修改名称
for imageName in ${images[@]} ; do
docker pull $DOCKERHUB_URL/$imageName
docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName
docker rmi $DOCKERHUB_URL/$imageName
done
# ----------end-----------
# 赋予权限
chmod +777 -R pull_k8s_images.sh
# 执行脚本
./pull_k8s_images.sh
4.3 单独安装coredns
# 版本号与 kubeadm config images list 命令中的仓库相对应
docker pull coredns/coredns:1.10.1
docker tag coredns/coredns:1.10.1 k8s.gcr.io/coredns/coredns:v1.10.1
docker rmi coredns/coredns:1.10.1
4.4 查看docker镜像
docker images
4.5 kubeadm初始化
# 初始化,--pod-network-cidr: 指定pod网络的IP地址范围
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=192.168.0.0/16
(注意:此时先不要将slave节点加入集群,因为还未配置flannel实现各节点网络通信!!!)
# 会生成加入此网络的token和密钥,用于子节点加入集群;后续也可自定义生成。
#(注意:此时先不要将slave节点加入集群,因为还未配置flannel实现各节点网络通信!!!)
kubeadm join 192.168.75.128:6443 --token c25pkn.jscezo41htjyskq4 \
--discovery-token-ca-cert-hash sha256:00e1968b50d29eca7bd46ad7601dfb0ac952c76c84c09cb7e3b983ea47448d69
遇到问题1:[ERROR CRI];
解决方法:vim /etc/containerd/config.toml
,注释掉其中的 disabled_plugins = ["cri"]
,然后重启容器systemctl restart containerd
,最后重新初始化。(注意:所有节点都需执行此操作)
遇到问题2:Initial timeout of 40s passed.
可能原因一: pause版本不对应。
解决方法:(注意:所有节点均要配置此处,不然加入集群时可能会出现后面问题3——flannel导致的node节点NotReady问题)
### 生成 containerd 的默认配置文件
containerd config default > /etc/containerd/config.toml
### 查看 sandbox 的默认镜像仓库在文件中的第几行
cat /etc/containerd/config.toml | grep -n "sandbox_image"
### 使用 vim 编辑器 定位到 sandbox_image,将仓库地址修改成国内镜像aliyun,且版本和之前对应好。
vim /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
### 重启 containerd 服务
systemctl daemon-reload && systemctl restart containerd.service
(注意:kubeadm每次初始化时都要reset一下:kubeadm reset
。)
可能原因二:若不是pause版本问题,则可以尝试如下方式;
# 到指定目录下创建文件
cd /etc/systemd/system/kubelet.service.d
sudo vim 10-kubeadm.conf
# 将以下内容加入其中:
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
五、启动k8s
5.1 设置环境变量
#临时设置
export KUBECONFIG=/etc/kubernetes/admin.conf
#永久设置
vim /etc/profile
#文件末尾添加
export KUBECONFIG=/etc/kubernetes/admin.conf
#需要重新登录root才生效
5.2 启动
#设置开机自启动,然后启动k8s
systemctl enable kubelet && systemctl start kubelet
#查看节点状态
kubectl get nodes
kubectl get cs
六、配置各节点内部网络通信(kube-flannel)
6.1 安装kube-flannel插件;
# 直接拉取配置(后期配置更麻烦,不推荐)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 手动下载,配置(推荐)
# 先将下面一行加入/etc/hosts文件最后面
199.232.68.133 raw.githubusercontent.com
# 下载
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 修改ip
net-conf.json: |
{
"Network": "192.168.0.0/16", #与集群ip保持一致
"EnableNFTables": false,
"Backend": {
"Type": "vxlan"
}
}
# 查看/etc/kubernetes/manifests/kube-controller-manager.yaml参数列表中有无下面内容,若没有则添加
- --allocate-node-cidrs=true
- --cluster-cidr=192.168.0.0/16 #与集群ip保持一致
# 应用
kubectl apply -f kube-flannel.yml
# 若遇到 "loadFlannelSubnetEnv failed: open /run/flannel/subnet.env: no such file or directory" 问题,可以先手动创建/run/flannel/subnet.env文件,并将以下内容加入其中。
FLANNEL_NETWORK=192.168.0.0/16
FLANNEL_SUBNET=192.168.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
6.2 slave节点加入集群;
# 方法一:slave节点直接使用master节点kubeadm init时生成的token和密钥加入集群
kubeadm join 192.168.75.128:6443 --token n0vu60.ah18209254aloh8b \
--discovery-token-ca-cert-hash sha256:01b01f30fb56225d9eb5e5181fa812f2a2e91f315fa2627c5fbb0cff37a841f0
# 方法二:master节点再次生成token和密钥,用于salve节点加入
# 生成token
kubeadm token create --ttl 0
# 查看token信息
kubeadm token list
# 生成密钥
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
# 在slave节点上使用master生成的token和密钥连接到集群
kubeadm join 192.168.75.128:6443 --token nc98au.ktwme05dnj7hrpj7 \
--discovery-token-ca-cert-hash sha256:f6f31a0dfb2e28af0ad84f9d04faea323e3ca93853e7938b999cea0bf4a7e15a
遇到问题3:发现两个slave节点都是NotReady。使用journalctl -f -u kubelet
查看原因(注意:此处具体问题有很多,大家可以根据实际情况寻找不同的解决方案),发现以下问题。
解决方法:同上面问题2。
遇到问题4:Error registering network: failed to acquire lease: node "master" pod cidr not assigned;
flannel pod无法正常启动,查看log则显示如下:即分配网络错误;
按照正常来说,执行了如下内容后不应该出现此问题,再次出现确实很意外;
# 查看/etc/kubernetes/manifests/kube-controller-manager.yaml参数列表中有无下面内容,若没有则添加
- --allocate-node-cidrs=true
- --cluster-cidr=192.168.0.0/16 #与集群ip保持一致
那么,我们可以直接给节点配置pod cidr ;
# 查看节点信息
kubectl describe node master
# 为节点配置pod cidr
kubectl patch node slave01 -p '{"spec":{"podCIDR":"10.244.1.0/24"}}'
(自此,k8s集群搭建完毕!!!)
七、k8s Dashboard(集群管理可视化工具一)
7.1 安装dashboard;
# dashboard和kubernetes的版本对应关系:https://github.com/kubernetes/dashboard/releases
# 下载dashboard的deployment文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
# 修改名称
mv recommended.yaml dashboard.yaml
#修改下载的yaml文件,添加type: NodePort,即外网访问
vim dashboard.yaml
# 一共三处,分别如下:
spec:
type: NodePort # 添加此处(修改一)
ports:
- port: 443
targetPort: 8443
nodePort: 32641 # 可修改,自定义端口(修改二)
selector:
k8s-app: kubernetes-dashboard
....
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
securityContext:
seccompProfile:
type: RuntimeDefault
nodeName: master #添加此行,表示运行在master节点上(修改三)。
# 未修改此处则报dial tcp 10.96.0.1:443: i/o timeout错误。
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.5.1
imagePullPolicy: Always
ports:
- containerPort: 8443
protocol: TCP
# 创建dashboard
$ kubectl apply -f dashboard.yaml
# 查看namespace为kubernetes-dashboard下创建的pods
$ kubectl get pods -n kubernetes-dashboard
7.2 查看dashboard创建的pods运行情况;
kubectl get pods -n kubernetes-dashboard
7.3 访问dashboard界面;
master节点访问https://127.0.0.1:32641,各节点访问master的IP地址和自定义端口均可打开dashboard界面,如:https://192.168.75.128:32641 和 https://master:32641。
7.4 访问dashboard。
# 创建管理员服务帐号并绑定管理员集群角色
mkdir -p /etc/kubernetes/dashboard
# 创建文件
vim /etc/kubernetes/dashboard/admin-user.yaml
# 将以下内容添加到admin-user.yaml文件
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
# 创建文件
vim /etc/kubernetes/dashboard/admin-user-role-binding.yaml
# 将以下内容添加到admin-user-role-binding.yaml文件
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
# 执行
kubectl apply -f /etc/kubernetes/dashboard/admin-user.yaml
kubectl apply -f /etc/kubernetes/dashboard/admin-user-role-binding.yaml
# 生成token,将token复制到dashboard界面即可登录。
cd /etc/kubernetes/dashboard/
kubectl -n kubernetes-dashboard create token admin-user
其他可能会遇到的问题:
-
Error from server (Forbidden): secrets is forbidden: User “system:node:master” cannot create resource “secrets” in API group “” in the namespace “kube-system”: can only read resources of this type.
export KUBECONFIG=/etc/kubernetes/admin.conf
-
Warning FailedCreatePodSandBox 7s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "8e1f0746a26590c5fe4467989828a45bd5514b48e90371ef1d5c37f9dfd4458c": plugin type="flannel" failed (add): failed to delegate add: failed to set bridge addr: "cni0" already has an IP address different from 192.168.70.1/24
# 针对报错pod的服务器执行以下命令
ifconfig cni0 down
ip link delete cni0
ifconfig cni0
八、Kuboard(集群管理可视化工具二)
8.1 安装Kuboard
sudo docker run -d \
--restart=unless-stopped \
--name=kuboard \
-p 80:80/tcp \
-p 32642:32642/tcp \
-e KUBOARD_ENDPOINT="http://192.168.75.128:80" \ # 内网ip + 端口
-e KUBOARD_AGENT_SERVER_TCP_PORT="32642" \ # 自定义端口
-v /root/kuboard-data:/data \
eipwork/kuboard:v3
8.2 访问Kuboard
任意节点访问 http://192.168.75.128:80 均可,用户名:admin,密码:Kuboard123。
8.3 导入k8s集群
(1) 按照Kuboard给的命令生成token;
(2) 填入集群名称、IP和token等信息,将集群导入Kuboard;(ApiServer地址:master_ip
+默认端口
,即 https://192.168.75.128:6443.)
九、Kubesphere(集群管理可视化工具三,k8s v1.21.x版本之前适用)
# k8s版本1.28
# 按照官网执行
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/kubesphere-installer.yaml
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/cluster-configuration.yaml
# 检查日志
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f
# 查看pod运行状态时发现启动失败CrashLoopBackOff,查看日志如下
2024-04-15T00:15:51+08:00 ERROR : error getting GVR for kind 'ClusterConfiguration': Get "https://10.96.0.1:443/api?timeout=32s": dial tcp 10.96.0.1:443: i/o timeout
2024-04-15T00:15:51+08:00 ERROR : Enable kube events for hooks error: Get "https://10.96.0.1:443/api?timeout=32s": dial tcp 10.96.0.1:443: i/o timeout
2024-04-15T00:15:51+08:00 INFO : TASK_RUN Exit: program halts.
# 此问题待解决...
十、k8s相关命令(常用的几种)
# 查看pods和svc
kubectl get pods,svc -n kube-system -o wide
# 查看pod的描述
kubectl describe pods -n kube-flannel kube-flannel-ds-hblnr
# 查看pod的日志
kubectl logs kubernetes-dashboard-79d57f5458-6j7p7 -n kubernetes-dashboard
# 删除pod,svc,deployment
kubectl delete pod kubernetes-dashboard-79d57f5458-6j7p7 -n kubernetes-dashboard
kubectl delete svc metrics-server -n kube-system
kubectl delete deployment metrics-server -n kube-system
# 创建pod
kubectl create -f recommended.yaml
# 更新pod
kubectl apply -f coredns.yaml
# 查看k8s集群所有节点
kubectl get nodes
# 查看所有pod
kubectl get pods -A
# 查看所有service
kubectl get svc -A
# 查看所有depolyment
kubectl get deployment -A
本文还在完善中......如有问题欢迎大家批评指正!!!
更多推荐
所有评论(0)