当前位置: 首页 > news >正文

Kubernetes(k8s)学习笔记(三)--部署 Kubernetes Master

前文已经使用docker安装了kubeadm,因此本文使用kubeadm部署master节点。

一.先拉取必要的镜像库到本地。

在拉取之前,先配下镜像加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://hub-mirror.c.163.com","https://mirror.ccs.tencentyun.com","https://docker.mirrors.ustc.edu.cn"]
}
EOF

 然后重启 Docker 生效

sudo systemctl daemon-reload
sudo systemctl restart docker

拉取必要的镜像,可执行下面的shell脚本来实现:

#!/bin/bashimages=(kube-apiserver:v1.17.3kube-proxy:v1.17.3kube-controller-manager:v1.17.3kube-scheduler:v1.17.3coredns:1.6.5etcd:3.4.3-0pause:3.1
)for imageName in ${images[@]} ; dodocker pull registry.aliyuncs.com/google_containers/$imageNamedocker tag registry.aliyuncs.com/google_containers/$imageName  k8s.gcr.io/$imageName
done

注意:registry.cn-hangzhou.aliyuncs.com镜像库已不再维护,请切换到上文的registry.aliyuncs.com镜像库。

二.使用kubeadm init完成master节点的初始化

通过执行下面的命令来实现

kubeadm init \
--apiserver-advertise-address=10.0.2.15 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--v=5

这一步非常关键,也是在耗费较多时间的这一步,执行了几次都失败,后面看到网友提到,

kubernetes-version v1.17.3是比较老的版本,需要用18.09.9的dock版本才能初始化成功,于是赶紧用docker --version命令查看服务器中的docker版本,这一看是26.1.4(当前最新版本)。于是卸载了该版本的docker,安装上18.09.9的docker,重新执行下面的命令,又遇到下面的错误

[preflight] Some fatal errors occurred: [ERROR Port-6443]: Port 6443 is in use [ERROR Port-10259]: Port 10259 is in use [ERROR Port-10257]: Port 10257 is in use [ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists [ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists [ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists [ERROR Port-10250]: Port 10250 is in use [ERROR Port-2379]: Port 2379 is in use [ERROR Port-2380]: Port 2380 is in use [ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty

因为之前初始化失败过,系统上已经存在一个 Kubernetes 集群的残留文件或进程,导致端口和文件冲突。要解决这个问题,需要彻底清理旧的 Kubernetes 环境,然后再重新初始化。以下是具体步骤:

1. 重置 Kubernetes 环境
(1) 使用 kubeadm reset 清理

sudo kubeadm reset --force

 这将会删除下面的文件:
Kubernetes 管理的容器(kubelet 创建的 Pod)
/etc/kubernetes/ 下的配置文件
网络插件相关的 CNI 配置

(2) 手动清理残留文件

sudo rm -rf /etc/kubernetes/  # 删除残留的 Kubernetes 配置文件
sudo rm -rf /var/lib/etcd/    # 删除 etcd 数据目录
sudo rm -rf $HOME/.kube       # 删除 kubectl 配置文件

(3) 清理占用端口的进程
检查哪些进程占用了 Kubernetes 相关端口(6443、10250、2379 等):

sudo netstat -tulnp | grep -E '6443|10259|10257|10250|2379|2380'

 发现占用进程(如旧 kube-apiserver、etcd),使用下面的命令手动终止:

sudo kill -9 <PID>  # 替换 <PID> 为实际进程 ID

执行完上面命令后,重新执行kubdadm ini命令,如果出现类似下面的说明,则表明成功啦

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 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 10.0.2.15:6443 --token ddxbg6.tjzfs3d7iyni1iun \ --discovery-token-ca-cert-hash sha256:f4913e091bdf5cc614771810c294e4a4cb258f769b307ad83fe9519356d4ba57

注意:上面的命令先不要着急clear掉,先把它拷贝到本地,稍候子节点加入master节点的时候需要用到。

三.配置 kubectl 访问权限

使用下面的命令:

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

 然后获取所有节点

kubectl get nodes

四.安装 Pod 网络插件(CNI)

方法一:可以将下面的代码复制到本地并创建一个名为kube-flannel.yml文件

然后执行kubectl apply -f  kube-flannel.yml命令来完成网络应用搭建,

---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:name: psp.flannel.unprivilegedannotations:seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/defaultseccomp.security.alpha.kubernetes.io/defaultProfileName: docker/defaultapparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/defaultapparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:privileged: falsevolumes:- configMap- secret- emptyDir- hostPathallowedHostPaths:- pathPrefix: "/etc/cni/net.d"- pathPrefix: "/etc/kube-flannel"- pathPrefix: "/run/flannel"readOnlyRootFilesystem: false# Users and groupsrunAsUser:rule: RunAsAnysupplementalGroups:rule: RunAsAnyfsGroup:rule: RunAsAny# Privilege EscalationallowPrivilegeEscalation: falsedefaultAllowPrivilegeEscalation: false# CapabilitiesallowedCapabilities: ['NET_ADMIN']defaultAddCapabilities: []requiredDropCapabilities: []# Host namespaceshostPID: falsehostIPC: falsehostNetwork: truehostPorts:- min: 0max: 65535# SELinuxseLinux:# SELinux is unused in CaaSPrule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: flannel
rules:- apiGroups: ['extensions']resources: ['podsecuritypolicies']verbs: ['use']resourceNames: ['psp.flannel.unprivileged']- apiGroups:- ""resources:- podsverbs:- get- apiGroups:- ""resources:- nodesverbs:- list- watch- apiGroups:- ""resources:- nodes/statusverbs:- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:name: flannelnamespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfgnamespace: kube-systemlabels:tier: nodeapp: 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-amd64namespace: kube-systemlabels:tier: nodeapp: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: beta.kubernetes.io/osoperator: Invalues:- linux- key: beta.kubernetes.io/archoperator: Invalues:- amd64hostNetwork: truetolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cniimage: quay.io/coreos/flannel:v0.11.0-amd64command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: quay.io/coreos/flannel:v0.11.0-amd64command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacevolumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/volumes:- name: runhostPath:path: /run/flannel- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-ds-arm64namespace: kube-systemlabels:tier: nodeapp: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: beta.kubernetes.io/osoperator: Invalues:- linux- key: beta.kubernetes.io/archoperator: Invalues:- arm64hostNetwork: truetolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cniimage: quay.io/coreos/flannel:v0.11.0-arm64command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: quay.io/coreos/flannel:v0.11.0-arm64command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacevolumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/volumes:- name: runhostPath:path: /run/flannel- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-ds-armnamespace: kube-systemlabels:tier: nodeapp: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: beta.kubernetes.io/osoperator: Invalues:- linux- key: beta.kubernetes.io/archoperator: Invalues:- armhostNetwork: truetolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cniimage: quay.io/coreos/flannel:v0.11.0-armcommand:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: quay.io/coreos/flannel:v0.11.0-armcommand:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacevolumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/volumes:- name: runhostPath:path: /run/flannel- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-ds-ppc64lenamespace: kube-systemlabels:tier: nodeapp: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: beta.kubernetes.io/osoperator: Invalues:- linux- key: beta.kubernetes.io/archoperator: Invalues:- ppc64lehostNetwork: truetolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cniimage: quay.io/coreos/flannel:v0.11.0-ppc64lecommand:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: quay.io/coreos/flannel:v0.11.0-ppc64lecommand:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacevolumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/volumes:- name: runhostPath:path: /run/flannel- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-ds-s390xnamespace: kube-systemlabels:tier: nodeapp: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: beta.kubernetes.io/osoperator: Invalues:- linux- key: beta.kubernetes.io/archoperator: Invalues:- s390xhostNetwork: truetolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cniimage: quay.io/coreos/flannel:v0.11.0-s390xcommand:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: quay.io/coreos/flannel:v0.11.0-s390xcommand:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacevolumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/volumes:- name: runhostPath:path: /run/flannel- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg

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

该地址可能被墙。

执行上面的命令等待大约 3 分钟,直到出现下面的提示

然后执行下面的命令查看指定名称空间的 pods

kubectl get pods -n kube-system 

查看所有名称空间的 pods

kubectl get pods –all-namespace

在执行上面这个命令的时候,又出现了一个问题

 

从中可以看到大部分节点已处于Running状态,但有2个节点是Pending状态。这样子是不行的,必须确保所有节点都处于Running状态才行。好吧,接下来就是想办法让corddns这2个跑起来。

coredns Pending 的常见原因是:
Node taint 导致无法调度
没有可用的 Pod 网络(Flannel 刚启动8分钟,有可能网络还没完全通)
资源不足(CPU/内存资源配额问题)
CNI 网络插件异常 

下面一步步检查:

第一步:检查 Node Ready 状态
确认node 是不是已经 Ready。
执行下面的命令检查:
kubectl get nodes
如果 STATUS 显示 NotReady,那就肯定是 taint 的问题,Pod 调度不下去。
如果 STATUS 是 Ready,那么继续看调度详情。
第二步:查看 coredns 调度失败原因
执行下面的命令检查:
kubectl describe pod -n kube-system coredns-9d85f5447-cb4nq
看Events这一段,里面会清楚告诉为什么 Pending(比如是 taints、不满足资源请求、还是网络问题)

执行完上面的命令后,Events部分显示:

Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 5m28s (x37 over 56m) default-scheduler 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate.

 

这句话意思就是:

  • 只有一个节点(k8s-node1)

  • 这个节点有 taint(就是 node.kubernetes.io/not-ready:NoSchedule

  • coredns Pod 没有加 Toleration 来容忍这个 taint

  • 所以调度失败了,Pending

从中可以看出node 已经基本正常了(否则 coredns不会一直排队调度),只是 taint 没去掉而已。

解决办法:

直接执行

kubectl taint nodes k8s-node1 node.kubernetes.io/not-ready:NoSchedule-

注意最后有一个 短横线(-,表示要把 taint 移除。

执行完这个命令,再次执行kubectl get pods –all-namespace命令,此时又出现另一种情况:

 coredns从Pending变成ContainerCreating,本以为等一会就好,没想到再次执行上面的命令还是ContainerCreating状态,一直卡在 ContainerCreating。

继续使用下面的命令确认一下 coredns 的具体状态:

kubectl describe pod -n kube-system coredns-9d85f5447-cb4nq

 在 Events 里提示

Warning  FailedScheduling  3m54s (x41 over 60m)   default-scheduler   0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate.
  Warning  NetworkNotReady   2m3s (x25 over 2m50s)  kubelet, k8s-node1  network is not ready: runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitializ

从中可以看出coredns Pod 现在卡在 ContainerCreating,原因是节点的网络还没准备好 

总结一下问题:

  • Flannel Pod虽然是 Running,但是 节点上(kubelet)并没有正确初始化 CNI网络插件配置

  • 所以 kubelet 现在处于 NetworkNotReady 状态。

  • coredns 启动依赖网络,没网络分配 IP,就卡在 ContainerCreating

这个问题出现的典型原因有几种:

  1. Flannel的CNI配置文件没有正确下发到 /etc/cni/net.d/

  2. CNI插件二进制(比如 /opt/cni/bin/)目录缺东西

  3. /etc/cni/net.d/ 目录为空,或者配置错了

根据上面的推断,一步步排查,先执行以下命令看看:

① 看一下 /etc/cni/net.d/ 目录

在 k8s-node1 节点上执行:

ls /etc/cni/net.d/

 正常来说,应该有一个类似 10-flannel.conflist10-flannel.conf 的文件。

如果目录是空的,就说明 CNI配置还没生成成功!我的里边是有 10-flannel.conflist 文件的,接着往下排查

② 看一下 CNI插件二进制是否存在

执行:

ls /opt/cni/bin/

提示:ls: cannot access /opt/cni/bin/: No such file or directory

结论:

  • Flannel部署的时候已经下发了CNI配置文件10-flannel.conflist),所以 kubelet能找到配置。

  • 但是,CNI二进制插件(就是 /opt/cni/bin/ 下的一堆执行程序)根本没有

  • 没有二进制,kubelet就算有配置也用不了,所以提示 NetworkPluginNotReady

这就是coredns卡住ContainerCreating的直接原因。

原因找到了,那么解决办法就是补充CNI插件!

只需要下载官方的 CNI 插件包,解压到 /opt/cni/bin/ 目录。

1.创建目录:

mkdir -p /opt/cni/bin

下载 CNI 插件(注意选跟你的 Kubernetes 版本兼容的,比如 v1.25 对应 CNI 0.8.x 或 1.0.x)我的是17.3版本,需要下载CNI v0.8.7,这个版本兼容性好,也比较稳定。

cd /opt/cni/bin
curl -LO https://github.com/containernetworking/plugins/releases/download/v0.8.7/cni-plugins-linux-amd64-v0.8.7.tgz
tar -xzvf cni-plugins-linux-amd64-v0.8.7.tgz

这个是github的地址,国内下载可能较慢,途中因等待时间有点久,将上面的命令停止后使用阿里云的镜像

curl -LO https://kubernetes-release.pek3b.qingstor.com/cni-plugins/v0.8.7/cni-plugins-linux-amd64-v0.8.7.tgz
结果下载完解压时提示:

[root@k8s-node1 bin]# tar -xzvf cni-plugins-linux-amd64-v0.8.7.tgz gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now

 这说明的问题是:

  • 下载的那个 cni-plugins-linux-amd64-v0.8.7.tgz 文件 根本就不是正确的 gzip 压缩包

  • 要么是下载失败了(比如网页404,实际上下载下来是个 HTML 错误页)

  • 要么是被拦截成了别的内容。

 可以简单看下文件大小:

ls -lh cni-plugins-linux-amd64-v0.8.7.tgz

 或者直接 cat 看看:

cat cni-plugins-linux-amd64-v0.8.7.tgz | head -n 10

结果提示:

{"status":404,"code":"object_not_exists","message":"The object you are accessing does not exist."... 

说明:

  • 这个下载链接 404了,文件压根不存在了!

重新用上面的github地址下载,下载完一定要先检查一下文件大小

ls -lh cni-plugins-linux-amd64-v0.8.7.tgz

正常是 38M 左右。如果文件大小无误,则进行解压:

tar -xzvf cni-plugins-linux-amd64-v0.8.7.tgz

然后重启 kubelet:

systemctl restart kubelet

 再次用kubectl get pods –all-namespace文件检查:

终于成功了。

如果以后换版本(比如升级 Kubernetes),记得也要同步更新对应的 CNI 插件版本
(一般大版本跨度大了,比如 1.17 ➔ 1.25,就要用新版CNI了)

将子节点加入 Kubernetes master节点,使用上面kubdadm init命令,上面提到拷贝到本地的命令

在子节点上去执行,在子节点上执行,不是在master节点

kubeadm join 10.0.2.15:6443 --token ddxbg6.tjzfs3d7iyni1iun \
    --discovery-token-ca-cert-hash sha256:f4913e091bdf5cc614771810c294e4a4cb258f769b307ad83fe9519356d4ba57

上面的token只有2小时的时效,如果token过期了,可以通过下面的命令重新生成:

kubeadm token create --print-join-command
kubeadm token create --ttl 0 --print-join-command
kubeadm join --token y1eyw5.ylg568kvohfdsfco --discovery-token-ca-cert-hashsha256: 6c35e4f73f72afd89bf1c8c303ee55677d2cdb1342d67bb23c852aba2efc7c73

执行 watch kubectl get pod -n kube-system -o wide 监控 pod 进度等 3-10 分钟,完全都是 running 以后使用 kubectl get nodes 检查状态

可以看到2个子节点已经加入到集群中了,但处于NotReady状态,是因为还没有像主节点那样进行网络配置,参照上文提到的flannel网络配置,对2个子节点进行配置网络即可。

 

相关文章:

Kubernetes(k8s)学习笔记(三)--部署 Kubernetes Master

前文已经使用docker安装了kubeadm&#xff0c;因此本文使用kubeadm部署master节点。 一.先拉取必要的镜像库到本地。 在拉取之前&#xff0c;先配下镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": [&qu…...

《数据结构之美--二叉树》

一&#xff1a;引言&#xff1a; 上次我们学习了栈和队列这两个数据结构&#xff0c;今天我们来学习一个新的数据结构–二叉树中的堆。 堆其实就是一种特殊的二叉树&#xff0c;具有二叉树的性质的同时&#xff0c;还具有其他的性质。 那么在学习堆之前还是先来了解一下树。 …...

Prompt Engineering 提示工程:释放大语言模型潜力的关键技术与实践指南

提示工程:释放大语言模型潜力的关键技术与实践指南 提示工程(Prompt Engineering)作为与大型语言模型(LLM)交互的核心技术,已成为AI应用开发的关键技能。本文将系统介绍提示工程的定义与发展历程,深入剖析其核心知识点,提供实用的设计框架与技巧,并通过丰富的实战案例展示…...

std::print 和 std::println

一、基本概念 std::print 和 std::println 是 C23 新增的格式化输出函数&#xff0c;旨在替代传统的 std::cout 链式调用。它们基于 std::format 实现&#xff0c;支持类型安全的格式化字符串&#xff0c;语法更简洁&#xff0c;性能更优15。 功能特点&#xff1a; 直接输出到…...

高压直流输电MATLAB/simulink仿真模型+说明文档

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2018Ra&#xff09;软件。建议采用matlab2018 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09; 使用一个传输功率为1000MW&#xff08;500 kV&#xff0c;2 kA&#xff09;直流互连…...

第十四章-PHP与HTTP协议

第十四章-PHP与HTTP协议 一&#xff0c;HTTP 协议详解 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最广泛的协议之一&#xff0c;用于客户端&#xff08;如浏览器&#xff09;与服务器之间的通信。它是 Web 技术的基石…...

【阿里云大模型高级工程师ACP学习笔记】2.6.用插件扩展答疑机器人的能力边界

一、学习目标 备考阿里云大模型高级工程师ACP认证,深入学习《2.6.用插件扩展答疑机器人的能力边界》这部分内容,主要期望达成以下目标: 理解智能体应用核心概念:理解智能体(Agent)应用的核心概念,包括其如何拓展大模型能力,突破传统答疑机器人局限。掌握构建Agent系统…...

用远程代理模式轻松实现远程服务调用,打开编程新大门

通过远程代理来实现一个简易的远程过程调用实例。带你打开新的大门。 Socket 远程代理服务案例 基于 Socket 的远程服务&#xff0c;我们需要完成以下步骤&#xff1a; 服务端实现&#xff1a;创建一个远程服务&#xff0c;通过 Socket 接受客户端请求并提供计算服务。 客户端…...

(001)Excel 快捷键

文章目录 时间 时间 当前日期&#xff1a;ctrl ; (分号)。当前时间&#xff1a;ctrl Shift ; (分号)。...

TMI投稿指南(二):投稿文章注意事项

文章结构&#xff1a; https://journals.ieeeauthorcenter.ieee.org/create-your-ieee-journal-article/create-the-text-of-your-article/structure-your-article/ 补充材料&#xff1a;准备补充材料 - IEEE 作者中心期刊 --- Prepare Supplementary Materials - IEEE Author…...

从困局到破局的AI+数据分析

从困局到破局的AI数据分析 困局&#xff1a;数据分析的四道高墙破局&#xff1a;AI赋能全流程数据分析远见&#xff1a;AI数据分析的革命性意义 数据是新时代的石油&#xff0c;人工智能是炼油厂。当两者强强联合&#xff0c;一场数据分析的革命正悄然发生。 多少次你面对Excel…...

12. RANSAC点云多平面拟合分割

本文看了博客RANSAC点云多平面拟合分割-CSDN博客的文章&#xff0c;该博客将多平面拟合分割讲的很详细了&#xff0c;这里只是作为笔记用。 1.RANSAC算法原理 三维平面拟合&#xff08;最小二乘法&#xff09; 具体实现见下面代码&#xff1a; def SVD(points):# 二维&#…...

Prompt

提示工程指南 | Prompt Engineering GuideGoogle 官方提示工程 (Prompt Engineering)白皮书 | 宝玉的分享https://www.geeksforgeeks.org/what-is-prompt-engineering-the-ai-revolution/Prompt Engineering for Reasoning ModelsPrompt Engineering with Reasoning Models 1.p…...

[特殊字符] SpringCloud项目中使用OpenFeign进行微服务远程调用详解(含连接池与日志配置)

&#x1f4da; 目录 为什么要用OpenFeign&#xff1f; 在cart-service中整合OpenFeign 2.1 引入依赖 2.2 启用OpenFeign 2.3 编写Feign客户端 2.4 调用Feign接口 开启连接池&#xff0c;优化Feign性能 3.1 引入OkHttp 3.2 配置启用OkHttp连接池 3.3 验证连接池生效 Feign最佳…...

迈瑞医疗:国际业务增长21.28% 发展中国家成重要增长引擎

4月28日&#xff0c;迈瑞医疗&#xff08;300760.SZ&#xff09;发布2024年年度报告。报告期内&#xff0c;公司实现营业收入367.26亿元&#xff0c;同比增长5.14%&#xff1b;实现归母净利润116.68亿元&#xff0c;同比增长0.74%&#xff1b;经营活动产生的现金流量净额124.25…...

「地平线」创始人余凯:自动驾驶尚未成熟,人形机器人更无从谈起

温馨提示&#xff1a;运营团队2025年最新原创报告&#xff08;共210页&#xff09; —— 正文&#xff1a; 近日&#xff0c;国内智驾芯片上市公司[地平线]创始人兼CEO余凯&#xff08;先生&#xff09;接受腾讯新闻访谈时&#xff0c;提到如今大火的人形机器人&#xff0c;核…...

R 语言科研绘图第 43 期 --- 桑基图-冲击

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.weixin.qq.c…...

SpringBoot应用原生或docker镜像容器集成Skywalking

相关组件及版本 序号 组件 版本 备注 1 skywalking-oap-server 8.9.1 2 elasticsearch 7.17.6 3 skywalking-ui 8.9.1 4 apache-skywalking-java-agent 8.15.0 一、JAR包方式部署服务 下载apache-skywalking-java-agent jar文件 使用如下名称执行 java \ -j…...

模板--进阶

1. 非类型模板参数 模板解决了两类问题 1控制数据类型 2控制某种设计逻辑 类域可以直接访问什么&#xff1f; 1static修饰的静态成员变量 2typedef定义的内嵌类型 3 内部类 下面我们就要引出一个模板的知识点----------再用类模板的时候从类模板里面去取东西的时候 要…...

PostgreSQL无法查看表中数据问题排查

在 PostgreSQL 中&#xff0c;恢复数据库后&#xff0c;使用 DBeaver 等工具可以看到数据库和表名&#xff0c;但无法查询到表中数据&#xff0c;可能是以下原因之一。以下是可能的原因和解决方法&#xff1a; 1. 恢复未完全成功 原因&#xff1a;数据库恢复过程中可能未完全成…...

实验研究 | 千眼狼高速摄像机驱动精密制造创新

研究背景 小模数齿轮作为精密制造领域的核心组件&#xff0c;以“结构紧凑、重量轻、精度高”等优势&#xff0c;广泛应用于航空航天、工业机器人、精密仪器、医疗设备、新能源和微电机等领域。传统抛光技术效率低、成本高、表面质量不足&#xff0c;电解等离子体抛光技术&am…...

AWS虚拟专用网络全解析:从基础到高级实践

导语 AWS虚拟专用网络是连接企业本地数据中心与AWS云环境的关键桥梁。本文将深入探讨AWS VPN的核心概念、配置方法、最佳实践以及常见问题解决方案,助您构建安全、可靠的混合云网络架构。 一、AWS VPN概述 1. 定义 AWS VPN是一种网络服务,允许用户通过加密隧道将本地网络…...

工业园区工厂企业数字IP广播应急呼叫对讲系统:数字IP广播极大提升工厂企业管理效率与应急响应效能

工业园区工厂企业数字IP广播应急呼叫对讲系统:数字IP广播极大提升工厂企业管理效率与应急响应效能 北京海特伟业科技有限公司任洪卓发布于2025年4月28日 在数字化转型浪潮下&#xff0c;IP应急广播呼叫对讲广播系统凭借其网络化、智能化、融合化、多元化等优势&#xff0c;已…...

我的HTTP和HTTPS

注释&#xff1a;本文章架构跟随小林coding&#xff0c;在此基础上加深个人理解 小林coding&#xff1a;https://xiaolincoding.com/network/2_http/http_interview.html HTTP基本概念 HTTP是什么&#xff1f; http的中文名是超文本传输协议&#xff0c;超文本就是html&…...

python_股票月数据趋势判断

目录 前置 代码 视频&月数据 前置 1 A股月数据趋势大致判断&#xff0c;做一个粗略的筛选 2 逻辑&#xff1a; 1&#xff09;取最近一次历史最高点 2&#xff09;以1&#xff09;中最高点为分界点&#xff0c;只看右侧数据&#xff0c;取最近一次最低点 3&#xf…...

计算机考研精炼 计网

第 19 章 计算机网络体系结构 19.1 基本概念 19.1.1 计算机网络概述 1.计算机网络的定义、组成与功能 计算机网络是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 …...

大数据应用开发和项目实战-Matplotlib

Matplotlib的介绍 Matplotlib 是 Python 的绘图库&#xff0c;它能让使用者很轻松地将数据图形化&#xff0c;并且提供多样化的输出格式。 Matplotlib 可以用来绘制各种静态&#xff0c;动态&#xff0c;交互式的图表。比如说散点图、柱状图等等。 Matplotlib的安装与…...

SQLMesh CLI 实战教程: 构建和维护数据转换管道的快速指南

在数据工程领域&#xff0c;构建和维护数据转换管道是一项复杂而关键的任务。SQLMesh 是一个强大的工具&#xff0c;可以帮助你简化这一过程。本文将带你快速了解如何使用 SQLMesh CLI 来构建和维护数据转换管道。本文的目标是在 30 分钟或更短的时间内&#xff0c;让你熟悉 SQ…...

行政区划代码

本文数据来源&#xff1a;中华人民共和国民政部 在平常数据研究和开发中&#xff0c;经常会用到行政区划代码。而行政区划代码的使用&#xff0c;因年份不同可能也不尽完全相同。故整理了1980年到2024年所有的行政区划代码。 这样不仅仅适用于研究区划代码的变更研究&#xf…...

Spring生命周期

在Spring框架中&#xff0c;Bean的生命周期指的是从Bean的创建到销毁的整个过程。这个过程包括了多个阶段&#xff0c;每个阶段都有特定的操作。下面是一个典型的Spring Bean生命周期的概述&#xff1a; 一. 实例化&#xff08;Instantiation&#xff09; 当Spring容器启动时&…...

前端连接websocket服务报错 Unexpected response code: 301

前端连接websocket服务报错 Unexpected response code: 301 引直连测试301重定向修改nginx配置 引 websocket后端服务正常&#xff0c;监听正常&#xff0c;可以通过简单的前端代码进行连接&#xff0c;但是通过nginx反向代理后报错Error during WebSocket handshake: Unexpec…...

C语言(5)—操作符详解

文章目录 一、操作符分类概览二、二进制与进制转换2.1 进制基本概念 三、原码、反码与补码3.1 基本概念 四、位操作符详解 一、操作符分类概览 C语言中的操作符可以分为以下几大类&#xff1a; 算术操作符&#xff1a;, -, *, /, % 移位操作符&#xff1a;<<, >>…...

ubuntu新增磁盘挂载

1. 确认新磁盘 使用 lsblk 命令查看系统中所有的块设备&#xff0c;找出新增的磁盘。 rootzzwl:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 60G 0 disk ├─sda1 8:1 0 …...

【计网】计算机网络的类别与性能

一、计算机网络的分类 计算机网络可以根据不同的标准进行分类。下面是两种常见的分类方法&#xff1a; 1.按照网络的作用范围进行分类 广域网 (WAN): 广域网覆盖的范围非常广泛&#xff0c;通常跨越城市、国家或甚至是全球。WAN主要用于连接地理位置相隔较远的计算机和网络设…...

Field访问对象int字段,对象访问int字段,通过openjdk17 C++源码看对象字段访问原理

在Java反射机制中&#xff0c;访问对象的int类型字段值&#xff08;如field.getInt(object)&#xff09;的底层实现涉及JVM对内存偏移量的计算与直接内存访问。本文通过分析OpenJDK 17源码&#xff0c;揭示这一过程的核心实现逻辑。 一、字段偏移量计算 1. Java层初始化偏移量…...

香橙派打包qt文件报错“xcb 插件无法加载”与“QObject::moveToThread”线程错误的解决方案

PyQt 报错总结&#xff1a;打包文件过程&#xff0c;“xcb 插件无法加载”与“QObject::moveToThread”线程错误的解决方案全解析 在使用 PyQt5 搭建图形界面时&#xff0c;打包文件的过程中出现的问题&#xff0c;真难绷&#xff0c;搞了半天。 Qt 平台插件 xcb 无法加载QOb…...

Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理

Flutter 学习之旅 之 flutter 作为 module &#xff0c;在 Android 的界面中嵌入Flutter界面功能的简单整理 目录 Flutter 学习之旅 之 flutter 作为 module &#xff0c;在 Android 的界面中嵌入Flutter界面功能的简单整理 一、简单介绍 二、在同一个布局中同时显示 Androi…...

在android 系统上qnn sdk转换,运行模型示例

前面讲了如何配置qnn sdk的环境&#xff0c;这一篇总结下qnn 实际转换一个onnx 模型&#xff0c;并运行的实现步骤。 设备&#xff1a; 1. ubuntu22.04 的Linux 服务器。 2. 一台android手机。 一、下载模型 from optimum.onnxruntime import ORTModelForSequenceClassifi…...

docker安装Canal1.1.5,MySQL5.7踩坑

docker安装Canal 前情提示安装MySQLdocker安装MySQL1. 拉取镜像2. 创建容器映射宿主机目录3. docker run 配置mysql重启mysql新建canal用户 安装Canal创建docker网络安装Canal1.拉取canal镜像2.创建目录3.运行容器 踩坑问题1 前情提示 关于版本问题&#xff0c;官方也没有详细…...

SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换

介绍 Spring Boot通过MessageSource接口来实现国际化&#xff0c;它可以加载不同的消息资源文件&#xff0c;通常是.properties格式。通过定义不同的语言文件&#xff08;例如&#xff1a;messages_en.properties、messages_zh.properties等&#xff09;&#xff0c;可以根据用…...

C++ 嵌套类 (详解 一站式讲解)

目录 嵌套类 嵌套类的定义 嵌套类结构的访问权限 pimpl模式&#xff08;了解&#xff09; 嵌套类 嵌套类的定义 首先介绍两个概念&#xff1a; 类作用域&#xff08;Class Scope&#xff09; 类作用域是指在类定义内部的范围。在这个作用域内定义的成员&#xff08;包括…...

EasyCVR视频汇聚平台助力大型生产监控项目摄像机选型与应用

一、方案背景 在300路大型生产监控项目中&#xff0c;由于生产环境复杂多样&#xff0c;涵盖室外厂区、大型车间、室内办公区域等不同场景&#xff0c;单一类型的摄像机难以满足全方位、精细化的监控需求。EasyCVR作为一款功能强大的视频融合管理平台&#xff0c;具备灵活的视…...

解决leensa无法使用的办法:平替教程

Leensa已经完全连不上&#xff0c;并显示超时&#xff0c;至于之前有传言称他们会恢复服务也完全是无稽之谈。 那么&#xff0c;Leensa停止服务后&#xff0c;广大的外贸人&#xff0c;设计人&#xff0c;留学生以及技术人学习&#xff0c;查资料以及开发客户该怎么办呢&#…...

算法思想之哈希表

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之哈希表 发布时间&#xff1a;2025.4.28 隶属专栏&#xff1a;算法 目录 算法介绍哈希表作用什么时候使用哈希表怎么使用哈希表 例题两数之和题目链接题目描述算法思路代码实现 判定是否互为字符重排题目链…...

springboot 视频分段加载在线播放

页面访问视频资源 前端播放加载部分视频,每次选中一个时间点后 往后加载一部分视频,主要用以节省网络传输的数据量 通过ResourceHttpRequestHandler类实现&#xff0c;ResourceHttpRequestHandler支持分片加载&#xff0c;前端请求头中携带Range: bytes 0-10001&#xff0c;就…...

【题解-Acwing】868. 筛质数

题目:868. 筛质数 题目描述 给定一个正整数 n,请你求出 1∼n 中质数的个数。 输入 共一行,包含整数 n。 输出 共一行,包含一个整数,表示 1∼n 中质数的个数。 数据范围 1 ≤ n ≤ 106 时空限制 0.2s / 64MB 输入样例 8输出样例 4代码 #include...

java 和 C#操作数据库对比

Java和C#在操作数据库方面有诸多相似之处&#xff0c;但也存在一些差异&#xff0c;以下从几个方面为你进行对比&#xff1a; 数据库连接 Java 在Java中&#xff0c;使用JDBC&#xff08;Java Database Connectivity&#xff09;来连接数据库。连接数据库的步骤通常包括加载…...

用 Python打造交互式图片-音视频管理器:代码分析与实践

在 Python 的 GUI 开发领域&#xff0c;wxPython 是一个功能强大且跨平台的框架&#xff0c;适合快速构建桌面应用程序。本文将深入分析一个基于 wxPython 的交互式图片管理器项目&#xff08;SelectModelToPlayVideoAndAudio.py&#xff09;&#xff0c;该程序允许用户管理图片…...

Django 缓存框架

动态网站的一个基本权衡是它们是动态的。每当用户请求页面时&#xff0c;Web 服务器进行各种计算&#xff0c;从数据库查询到模板渲染到业务逻辑&#xff0c;以创建您网站访问者看到的页面。从处理开销的角度来看&#xff0c;这比标准的从文件系统中读取文件的服务器安排要昂贵…...

后缀数组~

子串&#xff1a;在字符串s中&#xff0c;取任意i<j,那么在s中截取从i到j的这一段就叫做s的一个子串。 后缀&#xff1a;后缀就是从字符串的某个位置i到字符串末尾的子串&#xff0c;我们定义以s的第i个字符为第一个元素的后缀为suff(i)。 suff(1)就是从第一个字符到最后一个…...