搭建K8s集群

##kubernetes常用命令

删除集群中所有运行中的pod

kubectl delete pods --all

常见错误 节点notReady
/etc/hosts/问题:主机ip问题 重启电脑后/etc/hosts文件的配置没了

(一)云原生基础

ECS弹性部署

ECS 云服务器,弹性计算服务

ansible和terraform区别

terraform是编排工具,ansible是配置管理工具。编配/配置是一个创建基础设施的过程——虚拟机、网络组件、数据库等等。
在这里插入图片描述

k8s介绍

Master主要负责整个集群的管理工作,为集群提供管理接口,并监控和编排集群中的各个工作节点。各节点负责以 Pod形式运行Docker容器。
Master节点主要由apiserver、scheduler、contrller三个系统组件以及一个集群存储系统 etcd
组成。而API、UI、CLI则为管理员客户端操作方式。

  • kube-apiserver:Kubernetes API,集群的统一入口,各组件协调者,以RESTful
    API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。

  • kube-controller-manager(RC):处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。

  • kube-scheduler:根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。

  • etcd:分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。

创建pod

pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: demo
spec:
  containers:
  - name: testpod
    image: alpine:latest
    command: ["ping", "8.8.8.8"]
kubectl apply -f pod.yaml
kubectl get pods
kubectl logs demo
kubectl delete -f pod.yaml

(二)搭建k8s集群

容器云部署

1.基于dokcer desktop在本地搭建单节点k8s集群

(1)docker compose
(2)minikube等

2.基于dokcer desktop在本地搭建私有云多节点k8s集群

(1)docker swarm

局域网搭建集群
(2)kubeadm搭建
在这里插入图片描述

  • 安装docker服务
    ubuntu系统中安装
sudo apt-get update && sudo apt-get install docker.io

sudo systemctl start docker
sudo systemctl status docker

问题wi11 中 wsl windows for docker 用在wsl2 ubuntu系统中 unit not found
解决:ubun系统中下载docker

  • 安装前的准备工作:
    版本信息
    master节点:
    操作系统:ubuntu20.04
    Docker client:24.0.6
    Docker server:24.0.2
    kubectl:1.25.9

node:
操作系统:
操作系统:ubuntu22.04
Docker client:23.0.5
Docker server:23.0.5
kubectl:1.25.9

修改主机名

//master节点主机名设为Master
sudo vi /etc/hostname
#或者这样修改
sduo hostnamectl set-hostname Master

修改 Docker 配置
在“/etc/docker/daemon.json”里把 cgroup 的驱动程序改成 systemd ,然后重启 Docker 的守护进程,具体的操作我列在了下面:

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

问题:

System has not been booted with systemd as init system (PID 1). Can't operate.host is down

原因;wsl不支持systemctl
解决方法:方法一:

sudo apt-get update               // 更新软件包列表
$ sudo apt-get install -y systemd 

sudo nano /etc/wsl.conf):

[boot]
systemd=true
//关掉重启wsl
wsl.exe --shutdown

方法二:
使用

sudo service docker start

修改网络设置
为了让 Kubernetes 能够检查、转发网络流量,你需要修改 iptables 的配置,启用“br_netfilter”模块:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOF

sudo sysctl --system

修改交换分区
需要修改“/etc/fstab”,关闭 Linux 的 swap 分区,提升 Kubernetes 的性能:

sudo swapoff -a
free 
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
  • 安装kubeadm

配置阿里云镜像源

sudo apt install -y apt-transport-https ca-certificates curl

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt update



问题:直接通过apt install 会报No apt package “kubeadm”, but there is a snap with that name.
Try “snap install kubeadm”;
问题:通过snap install --classic 会报error: a single snap name is needed to specify mode or channel flags
验证版本

sudo apt install -y kubeadm=1.5.9-00 kubelet=1.25.9-00 kubectl=1.25.9-00


kubeadm version
kubectl version --client
sudo systemctl enable --now kubelet

锁定软件版本,避免意外升级导致错误

sudo apt-mark hold kubeadm kubelet kubectl
  • 下载kubernetes组件镜像
    kubeadm 把 apiserver、etcd、scheduler 等组件都打包成了镜像,以容器的方式启动 Kubernetes,但这些镜像不是放在 Docker Hub 上,而是放在 Google 自己的镜像仓库网站 gcr.io


//使用命令 kubeadm config images list 可以查看安装 Kubernetes 所需的镜像列表,参数 --kubernetes-version 可以指定版本号:
kubeadm config images list --kubernetes-version v1.25.9
//输出
registry.k8s.io/kube-apiserver:v1.25.9
registry.k8s.io/kube-controller-manager:v1.25.9
registry.k8s.io/kube-scheduler:v1.25.9
registry.k8s.io/kube-proxy:v1.25.9
registry.k8s.io/pause:3.8
registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/coredns/coredns:v1.9.3
//然后依次docker pull
docker pull registry.k8s.io/coredns/coredns:v1.9.3


问题:
系统重启之后 image 全部消失了 再重新现在 就下载不了
解决:国内镜像源

配置国内镜像源:

--image-repository registry.aliyuncs.com/google_containers
 sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version=v1.25.9 --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=172.22.1.117 --cri-socket=unix:///var/run/cri-dockerd.sock


  • 安装master节点

安装cri-dockerd

//下载二进制文件
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4.amd64.tgz
//解压
tar -zxvf cri-dockerd-0.2.6.amd64.tgz
 tar -zxvf cri-dockerd-0.3.4.amd64.tgz
 sudo cp ./cri-dockerd//cri-dockerd  /usr/bin/
  mkdir Cri-dockerd
  cd Cri-dockerd/
  git clone https://github.com/Mirantis/cri-dockerd.git
  sudo cp cri-dockerd/packaging/systemd/* /etc/systemd/system/
  sudo vim /etc/systemd/system/cri-docker.service
//
registry.aliyuncs.com/google_containers/pause:3.8
  文件 /etc/systemd/system/cri-docker.service Service.ExecStart 字段增加 --network-plugin 与 --pod-infra-container-image 选项。--pod-infra-container-image 镜像tag需要根据具体k8s安装版本指定。也就是要修改网络和根容器镜像。

ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://  --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8



sudo systemctl daemon-reload

 sudo systemctl enable cri-docker

 sudo systemctl start cri-docker

 sudo systemctl status cri-docker



//kubeadm init 的参数
-–pod-network-cidr,设置集群里 Pod 的 IP 地址段。
-–apiserver-advertise-address,设置 apiserver 的 IP 地址,对于多网卡服务器来说很重要(比如 VirtualBox 虚拟机就用了两块网卡),可以指定 apiserver 在哪个网卡上对外提供服务。
-–kubernetes-version,指定 Kubernetes 的版本号。

sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version=v1.25.9 --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=172.22.1.117 --service-cidr=10.1.0.0/16  --cri-socket=unix:///var/run/cri-dockerd.sock

问题1:

sudo kubeadm init  --kubernetes-version=v1.25.9
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running:

原因:这个问题是针对使用containerd作为CRI的情况 ,containerd安装的时候默认把CRI禁用了
解决:

sudo vim /etc/containerd/config.toml
//将disabled_plugins = ["cri"]中的“cri”删掉
//变为disabled_plugins = []
//保存退出
//重启containerd
sudo systemctl restart containerd

问题2:kube init一直不运行
容器运行时接口CRI:kubelet1.24以后 弃用了docker dockershim
docker下载时自动配置了containerd.sock
还可以使用第三方接口:docker-containerd插件 cri-dockerd
问题3:
Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the ‘criSocket’ field in the kubeadm configuration file
原因:没有整合kubelet和cri-dockerd

解决办法:在命令后面加上以下选项

--cri-socket unix:///var/run/cri-dockerd.sock

问题4;kubelet连接拒绝
原因:kubelet的cgroup和docker的cgroup不一致
修改了 /etc/docker/daemon.json的驱动无法生效
解决方法:修改kubelet的驱动为cgroupfs

sudo rm -rf /etc/kubernetes/*
sudo rm -rf ~/.kube/*
sudo rm -rf /var/lib/etcd/*

sudo kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
 
 sudo cat /var/lib/kubelet/config.yaml | grep cgroup
sudo vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl status docker
sudo systemctl restart kubelet
sudo systemctl status kubelet

journalctl -xeu kubelet

修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件或者/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf,增加–cgroup-driver=cgroupfs
Environment=“KUBELET_KUBECONFIG_ARGS=–bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=cgroupfs”

问题5:wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。

解决:防火墙开启服务

问题6:kubelet和docker cgroup修改之后不起作用
解决:重启系统

问题7:
[ERROR DirAvailable–var-lib-etcd]: /var/lib/etcd is not empty

rm -rf /var/lib/etcd

初始化成功后的页面如下:

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 172.22.1.117:6443 --token 8icc6m.fcqg5dbnwvqgrris \
        --discovery-token-ca-cert-hash sha256:3d96957a461f0c7bcb2d290f712d6eb2b278707e3bc4559a9586cfa3761904ca

按照上述提示,配置.kube文件

mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

问题:

sudo kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?

解决:

// 临时生效(退出当前窗口重连环境变量失效)
export KUBECONFIG=/etc/kubernetes/admin.conf
// 永久生效(推荐)
 echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc
 source  ~/.bashrc

还是无法解决,使用下面的

sudo kubectl --kubeconfig /etc/kubernetes/admin.conf  get nodes

配置pod网络

sudo kubectl apply --kubeconfig /etc/kubernetes/admin.conf -f https://raw.githubusercontent.com/coreos/
flannel/master/Documentation/kube-flannel.yml

sudo kubectl apply --kubeconfig /etc/kubernetes/admin.conf -f  kube-flannel.yml

sudo kubectl --kubeconfig /etc/kubernetes/admin.conf  get nodes
//如下显示 pod网络部署成功  flannel网络
NAME              STATUS   ROLES           AGE   VERSION
desktop-bfmi3u8   Ready    control-plane   95m   v1.25.9

问题:
master节点的ROLES只显示control-plane 不显示master

解决:

//节点标签
kubectl get nodes --show-labels

(3)搭建K8S Dashboard

$ curl -o kubernetes-dashboard.yaml  https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml

问题: error validating “kubernetes-dashboard.yaml”: error validating data: [apiVersion not set, kind not set]; if you choose to ignore these errors, turn validation off with --validate=false

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.0-alpha0/charts/kubernetes-dashboard.yaml

curl -o kubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.0-alpha0/charts/kubernetes-dashboard.yaml

sudo kubectl apply --kubeconfig /etc/kubernetes/admin.conf -f https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.0-alpha0/charts/kubernetes-dashboard.yaml

问题:v3.0.0 不兼容kubenetes 1.25.9 需要下载两个组件
解决改为v2.7.0

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

sudo kubectl apply --kubeconfig /etc/kubernetes/admin.conf -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

sudo kubectl apply --kubeconfig /etc/kubernetes/admin.conf -f  recommended.yaml
 sudo kubectl --kubeconfig /etc/kubernetes/admin.conf taint nodes  desktop-bfmi3u8 node-role.kubernetes.io/control-plane
:NoSchedule-
node/desktop-bfmi3u8 untainted
sudo kubectl get pods  --kubeconfig /etc/kubernetes/admin.conf -n kube-system -o wide


sudo kubectl --kubeconfig /etc/kubernetes/admin.conf  describe pods -n kube-system coredns-c676cc86f-fjr2f


sudo kubectl --kubeconfig /etc/kubernetes/admin.conf  describe node desktop-bfmi3u8
sudo kubectl get no --kubeconfig /etc/kubernetes/admin.conf  -o yaml | grep taint -A 5

问题:

 sudo kubectl get nodes  --kubeconfig /etc/kubernetes/admin.conf
The connection to the server 172.22.1.117:6443 was refused - did you specify the right host or port?

解决:

//每次重启电脑都要关闭交换分区
sudo swapoff -a
  • 节点加入
kubeadm join -v=2 172.22.1.117:6443 --token 8icc6m.fcqg5dbnwvqgrris --discovery-token-ca-cert-hash sha256:3d96957a461f0c7bcb2d290f712d6eb2b278707e3bc4559a9586cfa3761904ca --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version=v1.25.9   --cri-socket=unix:///var/run/cri-dockerd.sock

问题1:k8s从节点加入主节点[preflight] Running pre-flight checks卡住
解决:

时间同步:

kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间
#启动chronyd服务
systemctl start chronyd
#设置chronyd服务开机启动
systemctl enable chronyd
验证
使用date命令查看时间是否同步了,结果一致

如果遇到时间同步问题重启

kubeadm join -v 2 输出日志
ping master节点ip ping不通
ip地址写错了
//
controlPlaneEndpoint: "公网ip:6443"

问题2:coredns服务一直是creating 而不是running


解决方案:手动写入/run/flannel/subnet.env文件,再次查看为running
FLANNEL_NETWORK与pod-network-cidr保持一致
sudo vim  /run/flannel/subnet.env
FLANNEL_NETWORK=10.10.0.0/16
FLANNEL_SUBNET=110.10.1.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF

问题3:dashboard没有自动拉取镜像,服务也没跑起来
解决:

kubectl proxy
输出Starting to serve on 127.0.0.1:8001

然后通过
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy
访问
在这里插入图片描述

部署了某个服务没有成功如何删除这个服务?

防火墙服务未开启

sudo systemctl stop firewalld
Failed to stop firewalld.service: Unit firewalld.service not loaded.

原因:未安装防火墙

selinux

sudo setenforce 0
sudo: setenforce: command not found

sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
sed: can't read /etc/selinux/config: No such file or directory

3.基于公有云搭建多节点k8s集群

云服务器
购买服务

4.在线免费搭建k8s集群

网站:play-with-k8s
(1)初始化master

# --apiserver-advertise-address指定master在集群中的通讯地址
# --pod-network-cidr指定集群的子网范围
kubeadm init --apiserver-advertise-address 192.168.0.8 --pod-network-cidr=10.244.0.0/16

执行结果如下:

在这里插入图片描述
执行内容主要包括:
执行内容主要包括:

  • kubeadm执行初始化前的检查;
  • 生成token和证书;
  • 生成kubeConfig文件,后续kubelet与Master节点通信时需要用到这个;
  • 安装Master组件,会从Google的Registry下载组件的Docker镜像。这一步可能会花一些时间,主要取决于网络质量;
  • 安装附加组件kube-proxy和kube-dns;
  • Kubernetes Master初始化成功;
  • 提示如何配置kubectl,参考(2);
  • 提示如何安装Pod网络,参考(3);
  • 提示如何注册其他节点到Cluster,参考(4);

(2)配置kubectl

# 为root用户使用kubectl做配置
export KUBECONFIG=/etc/kubernetes/admin.conf

(3)安装pod网络

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

(4)注册其他节点到Cluster

kubeadm join 192.168.0.8:6443 --token pwavj7.pq9wskbhg1gc1ws3 \
    --discovery-token-ca-cert-hash sha256:8490581b6d223133473f0037104aaa9dac96f7dd9a01c3f54b3c50719540df24

5.搭建混合云集群

公有云+私有云

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Rancher是一个开源的容器管理平台,可以用来搭建和管理Kubernetes集群。使用Rancher搭建Kubernetes集群的步骤可以分为三个主要部分:虚拟机环境配置、安装Rancher和通过Rancher安装Kubernetes集群。 在虚拟机环境配置部分,你需要配置一台或多台虚拟机作为Kubernetes集群的节点。这包括设置虚拟机的操作系统和资源分配等配置。 接下来,在安装Rancher的部分,你需要在Docker中安装Rancher,这将提供一个可视化的管理界面来管理和监控Kubernetes集群。 最后,在通过Rancher安装Kubernetes集群的部分,你需要按照一系列步骤来配置和安装Kubernetes集群。这包括安装RKE和kubectl工具、使用RKE安装Kubernetes、设置环境变量、安装和配置Helm等。 当然,如果你想清理Rancher创建的Kubernetes集群,还可以按照相应的步骤进行清理操作。 综上所述,使用Rancher搭建Kubernetes集群的主要步骤包括虚拟机环境配置、安装Rancher和通过Rancher安装Kubernetes集群。<span class="em">1</span> #### 引用[.reference_title] - *1* [Rancher搭建k8s集群](https://blog.csdn.net/aa18855953229/article/details/112200578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值