OpenEular23.09(欧拉)操作系统为企业搭建独立的K8S集群环境,详细流程+截图

一.环境;

win10,vmware16 pro,openeular23.09

集群模式:一主二从

主机硬件配置
主机名IP角色CPU内存硬盘
k8s-master01192.168.91.100master4C4G40G
k8s-worker02192.168.91.101worker(node)4C4G40G
k8s-worker03192.168.91.102worker(node)4C4G40G

二.openEuler集群搭建;

单机版operEuler安装及配置按下面链接逐步操作即可;

VMware16 pro 安装openEuler-23.09-x86_64,详细操作流程+详图。-CSDN博客文章浏览阅读174次,点赞5次,收藏4次。那么这个空间设置成内存的2倍大小。点击IPv4设置--手动--添加--设置ip--设置DNS服务器,最后点击--“保存”;首先选中--“本地标准磁盘”,存储配置--自定义分区,点击--“完成”;在--主机名--设置主机名:(例如k8s-master01),点击--点击+,设置--挂载点/boot--期望容量,点击--添加挂载点;点击--+--挂载点swap--期望容量,点击--“添加挂载点”;默认选择--亚洲--上海,并调整日期和时间,点击--“完成”;设备类型--确认--LVM,卷组--选择“修改”;https://blog.csdn.net/shanxiderenheni/article/details/135247321

1.节点克隆;

搭建好主节点k8s-master01,先关机,再按照下图右键操作,克隆出两个工作节点k8s-worker02和k8s-worker03;(此时,三台虚拟机的账户,密码,IP,网络等信息都是一样的)

2.修改两个工作节点的主机名和IP;

hostnamectl set-hostname k8s-worker02

修改k8s-woker02节点的IP;

定位到指定目录命令:

cd /etc/sysconfig/network-scripts

编辑命令:

vim ifcfg-ens33

k8s-woker02:192.168.91.101

k8s-worker03节点的操作与上面相同;

k8s-worker03:192.168.91.102

3.网络相关重要配置检查一遍,一般没啥问题,眼过一遍即可;

两个worker节点都看一遍;

三.Xshell远程登录三台euler服务器;

四.全部集群主机修改hosts,完成主机名与IP的映射;

vim /etc/hosts


127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.91.100 k8s-master01
192.168.91.101 k8s-worker02
192.168.91.102 k8s-worker03

五.关闭全部主机防火墙;

关闭防火墙:

systemctl stop firewalld

禁止开机自启:

systemctl disable firewalld

查看防火墙状态:

systemctl status firewalld

六.所有主机关闭selinux;

sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

修改SELinux配置需要重启操作系统。

七.所有主机同步时间配置;

最小化安装系统需要安装ntpdate软件,此处安装的是服务器版本,带有update软件,直接使用即可;

安装命令:

yum  -y install ntpdate

编辑同步时间规则命令:

crontab -e

0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com

八.所有主机配置内核转发及网桥过滤;

开启内核路由转发命令:

vim /etc/sysctl.conf

(截图中命令显示两次,是我测试命令可用后,二次截图的操作)

配置内核参数,将桥接的IPv4流量传递到iptables的链的命令:(创建新文件+编辑内容)

cat <<EOF >/etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
EOF

执行该命令,如果不执行就会在应用k8s.conf时出现加载错误;

modprobe br_netfilter

使用新添加配置文件生效;

sysctl -p /etc/sysctl.d/k8s.conf

九.所有主机安装ipset及ipvsadm;

yum -y install ipset ipvsadm

回车,安装过程如下;

配置ipvsadm模块加载方式,添加需要加载的模块;

cat > /etc/sysconfig/modules/ipvs.module <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_sh
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- nf_conntrack
EOF

授权、运行、检查是否加载;

chmod 755 /etc/sysconfig/modules/ipvs.module && bash /etc/sysconfig/modules/ipvs.module && lsmod | grep -e ip_vs -e nf_conntrack

十.关闭SWAP分区;

方法一:

# 如果有的话,关闭swap分区
swapoff -a

# 永久关闭swap分区,注释掉fstab中包含swap的这一行
vim /etc/fstab 
# /dev/mapper/centos-swap swap                    swap    defaults        0 0

方法二:

#实时动态关闭
swapoff -a 


#禁止重启后自动开启
sed -i '/ swap / s/^/#/' /etc/fstab 

本案例采用方法二;

十一.所有主机重启;

reboot

十二.所有主机docker安装;

1.查看是否存在docker软件;

yum list | grep docker

2.安装docker;

dnf install docker

3.设置docker开机启动并启动;

systemctl enable --now docker

4.查看docker版本;

docker version

十三.k8s软件安装;

1.所有主机安装k8s依赖,连接跟踪;

dnf install conntrack

2.k8s-master01节点安装;

dnf install -y kubernetes-kubeadm kubernetes-kubelet kubernetes-master

3.k8s-worker02和k8s-worker03两个节点安装;

dnf install -y kubernetes-kubeadm kubernetes-kubelet kubernetes-node

k8s-worker02

k8s-worker03

4.所有主机设置开机自启kubelet;

systemctl enable kubelet

K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启。

5.所有主机现在启动kubelet.service;

systemctl start kubelet.service

6.所有主机查看kubelet运行状态;

systemctl status kubelet

 

所有主机重启kubelet;

systemctl restart kubelet

排查 hostname、etc/hosts等均正常。

十四.k8s集群初始化master节点(只在k8s-master01节点操作);

kubeadm init --node-name=k8s-master01 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version v1.25.3 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--apiserver-advertise-address=192.168.91.100 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12

错误一:“crictl not found in system path”;

需要安装crictl工具;

yum install -y  crictl

错误二:“socat not found in system path”;

需要安装socat工具;

yum install -y socat

错误三:[ERROR CRI]: container runtime is not running: output: time="2023-12-29T08:16:11+08:00" level=fatal msg="unable to determine runtime API version: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing dial unix /var/run/cri-dockerd.sock: connect: no such file or directory\""
, error: exit status 1

问题定位:

1.“container runtime is not running”,containerd服务未启动,查阅containerd运行状态;
systemctl status containerd

2.提示未找到containerd.service,需要安装containerd.service;
yum install -y containerd

3.yum安装containerd失败原因分析:
(1)k8s 1.24之后弃用了docker-shim。

dockershim 的作用是 Kubernetes 通过 CRI 来操作 Docker,所以Kubernetes 任何的功能变动或 Docker 有任何的功能特性变更,dockershim 代码必须加以改动保证能够支持相关的变更(维护特别不方便)。

        另外,Docker 的底层运行时是 containerd(大家装docker的时候应该也会发现有containerd这样几个东西),最终都是要调用 containerd且 containerd 自身也支持 CRI 。那为什么要先绕过一层 Docker 呢?是不是可以直接通过 CRI 跟 Containerd 进行交互呢?这也就造成了现在 Kubernetes 社区弃用 dockershim的原因。


(2)linux操作系统systemd的服务管理。

系统服务在/usr/lib/systemd/system目录下,名字为*.service之类的文件,systemctl可以通过文件名管理服务。这就是为什么有些systemctl 可以管理一些二进制启动的服务,linux的3.10的内核以后直接后台运行二进制程序显然不够优雅。

(3)主流的平台platform有x86(amd),arm(aarch)等等,操作系统也是分linux/windows的。

参考cpu架构,如果不熟悉的话,还是不好记住的,特别是amd/arm这种容易混。特别注意的是,用ctr命令拉取、导入、导出镜像,是需要指定平台的,否则有时候会报相关错误,ctr也支持全平台,但是文件就比较大了。

(4)containerd的工具为ctr,k8s管理containerd的工具为crictl。

ctr是containerd的工具,它运行时,需要在ctr 紧后加入-n namespace。例如k8s的镜像是放在k8s.io的命名空间下的,你直接用ctr查看,是看不到镜像的,你需要这样才能看到:ctr -n k8s.io images list。但是可以用crictl直接查看到k8s运行的服务的镜像。


4.用二进制文件安装containerd;
(1)下载地址(本测试用的是1.6.22版本,其他版本自行选择下载);

https://github.com/containerd/containerd/releases/tag/v1.6.22icon-default.png?t=N7T8https://github.com/containerd/containerd/releases/tag/v1.6.22

(2)上传,解压“cri-containerd-1.6.22-linux-amd64.tar.gz”;

上传containerd压缩包到k8s-master01节点,位置自选;

(3)解压containerd压缩包到“/usr/bin/”,或“/usr/local/bin/”;

因为这两个目录都具有系统的环境变量,可以直接运行。比如ssh命令其实就在/usr/bin/ssh

①本案例是解压到“/usr/local/bin/”,(因为该路径本来是空的,万一解压失败,回退也方便清理);

tar -zxvf cri-containerd-1.6.22-linux-amd64.tar.gz -C /usr/local/bin/

-------------------由于参考资料不完整--------------走的一段弯路start------------------记录一下-------------

赋予它们可执行权限,4=读,2=写,1=可执行,加一起就是他的权限。

chmod 0755 /usr/bin/containerd*
chmod 0755 /usr/bin/crictl
chmod 0755 /usr/bin/ctd-decoder
chmod 0755 /usr/bin/runc
chmod 0755 /usr/bin/ctr

-----------------------------------------------------------弯路end---------------------------------------------------------

正确方法如下:

etc目录:主要为containerd服务管理配置文件及cni虚拟网卡配置文件;

opt目录:主要为gce环境中使用containerd配置文件及cni插件;

usr目录:主要为containerd运行时的二进制文件,包含runc;

②拷贝二进制可执行文件到$PATH中;
[root@k8s-master01 /]# cd /usr/local/bin
[root@k8s-master01 bin]# ll
总计 16
-rw-r--r-- 1 root root  682  7月28日 03:48 cri-containerd.DEPRECATED.txt
drwxr-xr-x 3 root root 4096 12月29日 11:11 etc
drwxr-xr-x 3 root root 4096 12月29日 11:11 opt
drwxr-xr-x 3 root root 4096  7月28日 03:45 usr
[root@k8s-master01 bin]# ls usr/local/bin
containerd  containerd-shim  containerd-shim-runc-v1  containerd-shim-runc-v2  containerd-stress  crictl  critest  ctd-decoder  ctr
[root@k8s-master01 bin]# ls /usr/local/bin
cri-containerd.DEPRECATED.txt  etc  opt  usr
[root@k8s-master01 bin]# cp usr/local/bin/*  /usr/local/bin/
[root@k8s-master01 bin]# ls /usr/local/bin
containerd  containerd-shim  containerd-shim-runc-v1  containerd-shim-runc-v2  containerd-stress  cri-containerd.DEPRECATED.txt  crictl  critest  ctd-decoder  ctr  etc  opt  usr
# 方法一:先进入根目录 cd /usr/local/bin   再执行下面的命令
cp usr/local/bin/*  /usr/local/bin/

# 方法二:在任意目录执行下面的命令,路径都是从根目录开始计算
cp /usr/local/bin/usr/local/bin/*  /usr/local/bin/

containerd 的安装包中一共有五个文件,通过上面的命令它们被安装到了 /usr/local/bin 目录中:

containerd:即容器的运行时,以 gRPC 协议的形式提供满足 OCI 标准的 API

containerd-release:containerd项目的发行版发布工具

containerd-stress:containerd压力测试工具

containerd-shim:这是每一个容器的运行时载体,我们在 docker 宿主机上看到的 shim 也正是代表着一个个通过调用 containerd 启动的 docker 容器。

ctr:它是一个简单的 CLI 接口,用作 containerd 本身的一些调试用途,投入生产使用时还是应该配合docker 或者 cri-containerd 部署。

赋予它们可执行权限,4=读,2=写,1=可执行,加一起就是他的权限。

正确命令如下:

chmod 0755 /usr/bin/containerd*
chmod 0755 /usr/bin/crictl
chmod 0755 /usr/local/bin/ctd-decoder
chmod 0755 /usr/bin/runc
chmod 0755 /usr/local/bin/ctr

③把上面解压的这个文件containerd.service,放到systemd的目录下:"/usr/lib/systemd/system/";

解压文件完整根路径如下:

"/usr/local/bin/etc/systemd/system/containerd.service"

mv /usr/local/bin/etc/systemd/system/containerd.service /usr/lib/systemd/system/ 

④给containerd.service赋予权限;
chmod 0755 /usr/lib/systemd/system/containerd.service

如果你不想每次使用crictl都带一行类似下面这样的参数,

crictl --image-endpoint unix:///var/run/containerd/containerd.sock

那么你就执行下面的命令:

cat >>/etc/crictl.yaml <<EOF
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF

(4)启动containerd;
a.查询containerd运行状态:
systemctl status containerd
b.启动containerd命令:
    systemctl daemon-reload
    systemctl enable containerd
    systemctl start containerd

十五.主节点k8s-master01执行集群初始化;

# k8s集群初始化
kubeadm init --node-name=k8s-master01 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version v1.25.3 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--apiserver-advertise-address=192.168.91.100 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12

# 如果初始化失败,可以重置;
kubeadm reset --cri-socket unix:///var/run/cri-docker.sock

但是切换到这个目录,发现目录是空的。(未截图)

1.查看kubelet启动日志;

# 检查journal日志
journalctl -u kubelet --no-pager

报错现象:kubelet 日志报 ​​network plugin is not ready: cni config uninitialized​​

解决方法:网络插件(flannel 或者 calico)没有安装或者安装失败。

2.安装部署网络插件(master节点上);

必须安装网络组件否则k8s各个节点都是Noready状态;

calico和flannel二选一(本次安装使用的是flannel网路插件

在此处下载 kube-flannel.yml;

Releases · flannel-io/flannel · GitHubflannel is a network fabric for containers, designed for Kubernetes - Releases · flannel-io/flannelicon-default.png?t=N7T8https://github.com/flannel-io/flannel/releases

直接apply: kubectl apply -f kube-flannel.yml
也可直接复制下面的命令:

cat >  kube-flannel.yml << EOF
---
kind: Namespace
apiVersion: v1
metadata:
  name: kube-flannel
  labels:
    k8s-app: flannel
    pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
- apiGroups:
  - networking.k8s.io
  resources:
  - clustercidrs
  verbs:
  - list
  - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: flannel
  name: flannel
  namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-flannel
  labels:
    tier: node
    k8s-app: flannel
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-flannel
  labels:
    tier: node
    app: flannel
    k8s-app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
        image: docker.io/flannel/flannel-cni-plugin:v1.2.0
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
        image: docker.io/flannel/flannel:v0.22.3
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: docker.io/flannel/flannel:v0.22.3
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
        - name: xtables-lock
          mountPath: /run/xtables.lock
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate
EOF

flannel 的pod启动正常后,如果节点还是Notready,需要安装kubernetes-cni

yum install -y kubernetes-cni

ls -lh /opt/cni/bin

3.检测主机环境是否达到集群的要求,可根据结果提示进行逐一排除故障;

kubeadm init --dry-run

下面的输出结果很重要,根据提示操作,应该就可以启动k8s集群了;

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/tmp/kubeadm-init-dryrun2893094232/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 192.168.91.100:6443 --token zvm9d0.fzrnxmnb126pflg2 \
	--discovery-token-ca-cert-hash sha256:a8813f618c6155d3284fdc8aa7c4f896399c61d896299425d37747f12d2e3fb0 

记得保存好最后的 kubeadm join的信息node节点加入集群需要token!!!
不然要执行生成token;

kubeadm token create --print-join-command  
#利用kubeadm命令重新生成token,node 节点加入集群需要token
#普通用户执行下面命令;每次启动自动加载$HOME/.kube/config下的密钥配置文件(K8S自动行为);
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/tmp/kubeadm-init-dryrun2893094232/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#命令的含义:Kubectl 是一个命令行接口,用于对 Kubernetes 集群运行命令。
#Kubectl 在 $HOME/.kube 目录中寻找一个名为 config 的文件。
#你可以通过设置环境变量 KUBECONFIG 或设置 --kubeconfig 参数指定其它 kubeconfig 文件
#当集群初始化成功后,要使 kubectl 适用于非 root 用户,则需要运行以下命令,这些命令也是 kubeadm init输出的一部分
#即创建.kube目录 -> 拷贝配置文件 -> 用户授权

#当然,如果你是 root 用户,则可以直接添加环境变量:
执行  export KUBECONFIG=/etc/kubernetes/admin.conf


kubectl cluster-info   
#查看一下是否成功,等待一会儿,同时可以发现像etc,controller,scheduler等组件都以pod的方式安装成功

cp -i /etc/kubernetes/tmp/kubeadm-init-dryrun2893094232/admin.conf /etc/kubernetes/admin.conf

4.【kubectl get nodes】查看当前节点异常“The connection to the server 192.168.91.100:6443 was refused - did you specify the right host or port?”;

kubectl get nodes

报错:The connection to the server 192.168.91.100:6443 was refused - did you specify the right host or port?

mkdir /etc/containerd

containerd config default > /etc/containerd/config.toml

"/etc/containerd/config.toml"这个文件好像没啥用,还是删了。

rm -rf /etc/containerd/config.toml

systemctl restart containerd

Kubeadm初始化依然报错:

“[ERROR CRI]: container runtime is not running:”

正确操作如下:
(1)确保下面命令执行且生效,"admin.conf......";
#普通用户执行下面命令;每次启动自动加载$HOME/.kube/config下的密钥配置文件(K8S自动行为);
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/tmp/kubeadm-init-dryrun2893094232/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#命令的含义:Kubectl 是一个命令行接口,用于对 Kubernetes 集群运行命令。
#Kubectl 在 $HOME/.kube 目录中寻找一个名为 config 的文件。
#你可以通过设置环境变量 KUBECONFIG 或设置 --kubeconfig 参数指定其它 kubeconfig 文件
#当集群初始化成功后,要使 kubectl 适用于非 root 用户,则需要运行以下命令,这些命令也是 kubeadm init输出的一部分
#即创建.kube目录 -> 拷贝配置文件 -> 用户授权

#当然,如果你是 root 用户,则可以直接添加环境变量:
export KUBECONFIG=/etc/kubernetes/admin.conf

echo "KUBECONFIG=/etc/kubernetes/admin.conf" >>  ~/.bashrc && source  ~/.bashrc

# 查看当前节点
kubectl get nodes
(2)所有主机重置k8s集群;
kubeadm reset

(3)所有主机删除$HOME/.kube;
rm -rf $HOME/.kube

# master节点执行k8s集群初始化命令
# 使用docker容器
kubeadm init --node-name=k8s-master01 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version v1.25.3 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--apiserver-advertise-address=192.168.91.100 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12

# 使用containerd作为容器,不再使用docker
kubeadm init --node-name=k8s-master01 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version v1.25.3 \
--apiserver-advertise-address=192.168.91.100 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12

# 如果初始化失败,可以重置(所有主机) 
kubeadm reset 
(4)master节点执行 k8s初始化失败:The kubelet is not running;

# 如果初始化失败,必须重置(所有主机)
kubeadm reset 

不重置,会提示.yaml配置文件已经存在,无法初始化;

(5)重置后,k8s集群初始化提示超时,[kubelet-check] Initial timeout of 40s passed;

(6)修改/lib/systemd/system/kubelet.service;

this might take a minute or longer if the control plane images have to be pulled #1023(https://github.com/kubernetes/kubeadm/issues/1023), 尝试一下,没想到竟然成功了!方法就是修改/lib/systemd/system/kubelet.service,添加kubelet启动参数如下:
[Service]
ExecStart=/usr/bin/kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml

然后,重启计算机,所有主机执行sudo kubeadm reset 后重新执行下面初始化命令;

kubeadm init --node-name=k8s-master01 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version v1.25.16 \
--apiserver-advertise-address=192.168.91.100 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12
# 查看原来内容
cat /lib/systemd/system/kubelet.service

# 查阅"/etc/kubernetes/kubelet.conf"内容
cat /etc/kubernetes/kubelet.conf

# 修改/lib/systemd/system/kubelet.service内容
# [Service]
# ExecStart=/usr/bin/kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml

vim /lib/systemd/system/kubelet.service

然后,重启计算机,所有主机执行sudo kubeadm reset 后重新执行sudo kubeadm init。

重启master节点后,k8s集群初始化仍然报错;

(7)所有主机修改镜像仓库和添加k8s阿里云YUM软件源
# 修改镜像仓库
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
# 添加k8s阿里云YUM软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

初始化过程说明:

  • [preflight] kubeadm 执行初始化前的检查。
  • [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
  • [certificates] 生成相关的各种token和证书
  • [kubeconfig] 生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信
  • [control-plane] 安装 Master 组件,会从指定的 Registry 下载组件的 Docker 镜像。
  • [bootstraptoken] 生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
  • [addons] 安装附加组件 kube-proxy 和 kube-dns。 Kubernetes Master 初始化成功,提示如何配置常规用户使用kubectl访问集群。 提示如何安装 Pod 网络。 提示如何注册其他节点到 Cluster。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/281890.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

toto的2023年终总结

第一次写年终总结&#xff0c;其实顺带是把大学四年的学习都给总结了一下&#xff0c;称之为大学总结更为合适吧&#xff1f; 其实把年终总结发在CSDN上有些不适&#xff0c;之前一直想着搭一个自己的博客也因为种种事情一直没有完成&#xff0c; 索性发在这里了&#xff0c;作…

什么是边缘案例测试?如何查找并确定优先级

何为边缘情况&#xff1f; 在极端条件下发生的情况被称为边缘情况&#xff0c;有时候也叫边界情况&#xff0c;在功能、回归、单元和性能测试中都会应用。如果质量保证团队知道某项功能的最大和最小负载&#xff0c;他们就能防止这些情况发生。当用户不按照程序的预期工作流程…

Windows不同的域名由不同的DNS服务器解析

gpedit.msc(组策略)-计算机配置-Windows设置-域名解析策略 本次改动在注册表中体现的位置。 计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Dnscache\Parameters\DnsPolicyConfig\{666881c9-5525-434b-a62a-2ed5c61d53e5} 计算机\HKEY_LOCAL_MACHINE\SYSTEM\Cur…

⑩①【缓存】Redis持久化 RDB + AOF

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ ⑩①Redis持久化 RDB AOF Redis数据快照 - RD…

XXE注入漏洞总结

XXE和XML概念 XML被设计为传输和存储数据&#xff0c;XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文档元素&#xff0c;其焦点是数据的内容&#xff0c;其把数据从HTML分离&#xff0c;是独立于软件和硬件的信息传输工具。XXE漏洞全称XML Externa…

C++每日一练(8):图像相似度

题目描述 给出两幅相同大小的黑白图像&#xff08;用0-1矩阵&#xff09;表示&#xff0c;求它们的相似度。 说明&#xff1a;若两幅图像在相同位置上的像素点颜色相同&#xff0c;则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。…

软件测试/测试开发丨Linux 数据处理三剑客学习笔记

一、Linux 三剑客之 grep 1、 内容检索 获取行&#xff08;单行&#xff09; grep pattern file获取内容 grep -o pattern file获取上下文 grep -A -B -C pattern file 2、 文件检索 递归搜索 grep pattern -r dir/展示匹配文件名 grep -H 111 /tmp/1只展示匹配文件名 grep …

算法学习系列(十四):并查集

目录 引言一、并查集概念二、并查集模板三、例题1.合并集合2.连通块中点的数量 引言 这个并查集以代码短小并且精悍的特点&#xff0c;在算法竞赛和面试中特别容易出&#xff0c;对于面试而言&#xff0c;肯定不会让你去写一两百行的代码&#xff0c;一般出的都是那种比较短的…

FPGA - 231227 - 5CSEMA5F31C6 - 电子万年历

TAG - F P G A 、 5 C S E M A 5 F 31 C 6 、电子万年历、 V e r i l o g FPGA、5CSEMA5F31C6、电子万年历、Verilog FPGA、5CSEMA5F31C6、电子万年历、Verilog 顶层模块 module TOP(input CLK,RST,inA,inB,inC,switch_alarm,output led,beep_led,output [41:0] dp );// 按键…

00-Git 详解

Git 应用 一、Git概述 1.1 什么是Git git 是一个代码协同管理工具&#xff0c;也称之为代码版本控制工具&#xff0c;代码版本控制或管理的工具用的最多的&#xff1a; svn、 git。 SVN 是采用的 同步机制&#xff0c;即本地的代码版本和服务器的版本保持一致&#xff08;提…

社区医院挂号预约服务管理系统95an6

社区医院管理服务系统具有社区医院信息管理功能的选择。社区医院管理服务系统采用p[ython技术&#xff0c;基于django框架&#xff0c;mysql数据库进行开发&#xff0c;实现了首页、个人中心、用户管理、医生管理、预约医生管理、就诊信息管理、诊疗方案管理、病历信息管理、健…

创建您的第一个记忆卡片游戏

大家好&#xff01;今天&#xff0c;我们将一起探索如何用HTML、CSS和JavaScript创建一个有趣的记忆卡片游戏。我们的游戏规则很简单&#xff1a;用户需要找到一对一样的卡片。如果你是编程新手&#xff0c;不用担心&#xff0c;我会逐步引导你完成这个项目。 正文&#xff1a…

MFC扩展库BCGControlBar Pro v34.0 - 仪表盘控件全面升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v34.0已正式发布了&#xff0c;该版本包括新的主题任务对话框、图像效果、旋转圆形刻度、…

C语言转WebAssembly的全流程,及Web端调用测试

第一步&#xff1a;安装环境 参考网址&#xff1a;https://emscripten.org/docs/getting_started/downloads.html 具体过程&#xff1a; 克隆代码&#xff1a;git clone https://github.com/emscripten-core/emsdk.git进入代码目录&#xff1a;cd emsdk获取最新远端代码&…

uniapp 安卓模拟器链接

下载genymotion 安装 配置adb路径 模拟端口设为 5307

C#上位机与欧姆龙PLC的通信06---- HostLink协议(FINS版)

1、介绍 对于上位机开发来说&#xff0c;欧姆龙PLC支持的主要的协议有Hostlink协议&#xff0c;FinsTcp/Udp协议&#xff0c;EtherNetIP协议&#xff0c;本项目使用Hostlink协议。 Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令&#xff0c;可…

qt中信号槽第五个参数

文章目录 connent函数第五个参数的作用自动连接(Qt::AutoConnection)直接连接(Qt::DirectConnection - 同步)同线程不同线程 队列连接(Qt::QueuedConnection - 异步)同一线程不同线程 锁定队列连接(Qt::BlockingQueuedConnection) connent函数第五个参数的作用 connect(const …

数据统计的一些专业术语学习

数据统计的一些专业术语学习 1. 极差2. 方差3. 标准差4. 均值绝对差 1. 极差 数据统计的极差&#xff0c;又称全距&#xff0c;是指一组数据中最大值和最小值之差。 举个例子&#xff0c;如果我们有一组数据&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c…

C# 图标标注小工具-查看重复文件

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Windows.Forms;namespace ImageDuplicate {public partial clas…
最新文章