K8s集群搭建及相关问题

目录

一、安装docker

二、安装k8s

三、配置各节点网络

四、选取master节点,安装初始化(只在master节点配置)

五、启动k8s

六、配置各节点内部网络通信(kube-flannel)

七、k8s Dashboard(集群管理可视化工具一)

八、Kuboard(集群管理可视化工具二)

九、Kubesphere(集群管理可视化工具三,k8s v1.21.x版本之前适用)

十、k8s相关命令(常用的几种)


本文参考文章如下,首先在此感谢各位大佬写的文章!!!

在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。)

五、启动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。

(自此,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:32641https://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

本文还在完善中......如有问题欢迎大家批评指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值