ubuntu22.04离线安装K8S
1. 准备离线安装包
参考教程离线包准备教程
2. 准备环境
2.1. 准备主机
主机名 | ip | 系统 |
---|---|---|
k8s-master | 192.168.38.128 | ubuntu22.04 |
k8s-node | 192.168.38.131 | ubuntu22.04 |
2.2. 设置host
修改 /etc/hosts 文件,添加master和node节点,需要和主机名保持一致
2.3. 禁用swap
kubeadm初始化时会提示用户禁用swap,修改 /etc/fstab 文件,注释掉swap
# 查看是否关闭swap分区
swapoff -a
# 查看swap分区命令
swapon --show
2.4. 安装chrony
# 查看时区,时间
date
# 替换时区为上海市区
timedatectl set-timezone Asia/Shanghai
# 安装命令,联网同步时间
apt install chrony -y
# 开机启动
systemctl enable --now chrony
2.5. 安装ipset、ipvsadm
# 安装命令
apt install ipset ipvsadm -y# 创建IPVS内核配置文件
cat << EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF# 手动加载模块
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- ip_conntrack
2.6. 配置内核模块
# 创建K8S内核配置
cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF# 手动执行,加载模块
modprobe overlay
modprobe br_netfilter# 创建IPV4内核配置文件
cat >> /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF# 加载内核
sysctl --system
2.4. 安装docker和containerd
# 要将Ubuntu上的Docker升级到最新版本,可以按照以下步骤进行操作:
# 卸载旧版本的Docker:如果您已经安装了旧版本的Docker,请先卸载它们。可以使用以下命令卸载旧版本的Docker:
apt-get remove docker docker-engine docker.io containerd runc# 安装依赖项:升级Docker之前,需要确保系统具有必要的依赖项。可以使用以下命令安装这些依赖项:
apt-get update
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common# 添加Docker官方GPG密钥:可以使用以下命令添加Docker官方GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -# 添加Docker官方存储库:使用以下命令将Docker官方存储库添加到APT源列表中:
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"# 安装Docker CE:现在,可以使用以下命令安装Docker CE(社区版):
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io# 验证Docker安装是否成功:可以使用以下命令验证Docker安装是否成功:
docker run hello-world
# 如果Docker安装成功,将输出“Hello from Docker!”消息。# 如果已经安装过Docker并且运行了容器,需要重启Docker
systemctl restart docker# 设置开机自启
systemctl enable docker
2.5. 修改配置containerd
apt-get安装的containerd默认配置是禁用cri插件的,需要手动更改配置
# 备份原配置
mv /etc/containerd/config.toml /etc/containerd/config.toml_bak
# 读取containerd默认配置并且保存
containerd config default > /etc/containerd/config.toml
# 重启containerd
systemctl restart containerd
注:默认安装的containerd1.7.25使用的sandbox_image配置是3.8,安装k8s建议将其改为3.10,我们的离线安装包下载的pause版本也是3.10
修改指定内核驱动为Cgroup
3. 安装kubernetes节点
3.1. 【所有节点】安装kubeadm、kubelet、kubectl
# 使用我们下载的二进制文件即可
install kubeadm /usr/local/bin/kubeadm
install kubelet /usr/local/bin/kubelet
install kubectl /usr/local/bin/kubectl
其中,kubelet需要配置成 systemd 服务,我们需要手动添加文件 /etc/systemd/system/kubelet.service,内容如下
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
Wants=network-online.target
After=network-online.target[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10[Install]
WantedBy=multi-user.target
# 给文件添加授权
chmod +x /etc/systemd/system/kubelet.service
# 注册服务
systemctl daemon-reload
# 启动服务
systemctl start kubelet
# 设置开机启动
systemctl enable kubelet# 其他常用命令
# 检查kubelet状态
systemctl status kubelet
# 检查kubelet启动日志
journalctl -xeu kubelet
# 重启kubelet
systemctl restart kubelet
3.2. 【所有节点】安装k8s镜像
安装镜像前,我们可以使用下面命令确认必要镜像名称
# 查看初始化需要的镜像
kubeadm config images list
# 直接拉取初始化需要的镜像
kubeadm config images pull
# 查看kubeadm默认配置
kubeadm config print init-defaults
注:此处可以根据默认配置读取到不同的镜像,但是有个小坑,coredns这个镜像会自动删掉一段,如果是离线安装镜像的小伙伴需要注意重新tag一下
root@k8s-master:/etc/kubernetes/pki# kubeadm config images list
registry.k8s.io/kube-apiserver:v1.32.1
registry.k8s.io/kube-controller-manager:v1.32.1
registry.k8s.io/kube-scheduler:v1.32.1
registry.k8s.io/kube-proxy:v1.32.1
registry.k8s.io/coredns/coredns:v1.11.3
registry.k8s.io/pause:3.10
registry.k8s.io/etcd:3.5.16-0
root@k8s-master:/opt/software/kubernetes/K8S/1.32.1# kubeadm config images list --config=init.cn.yaml
k8s.mirror.nju.edu.cn/kube-apiserver:v1.32.1
k8s.mirror.nju.edu.cn/kube-controller-manager:v1.32.1
k8s.mirror.nju.edu.cn/kube-scheduler:v1.32.1
k8s.mirror.nju.edu.cn/kube-proxy:v1.32.1
k8s.mirror.nju.edu.cn/coredns:v1.11.3
k8s.mirror.nju.edu.cn/pause:3.10
k8s.mirror.nju.edu.cn/etcd:3.5.16-0
安装k8s的容器镜像时,需要指定namespace,k8s的namespace默认是k8s.io,安装命令如下
ctr -n k8s.io i import conformance_v1.32.1.tar
ctr -n k8s.io i import kubectl_v1.32.1.tar
ctr -n k8s.io i import kube-apiserver_v1.32.1.tar
ctr -n k8s.io i import kube-proxy_v1.32.1.tar
ctr -n k8s.io i import kube-scheduler_v1.32.1.tar
ctr -n k8s.io i import kube-controller-manager_v1.32.1.tar
ctr -n k8s.io i import coredns_v1.11.3.tar
ctr -n k8s.io i import pause_3.10.tar
ctr -n k8s.io i import etcd_3.5.16-0.tar
除此以外还有fannel的镜像和dashboard的镜像需要安装,安装命令如下
ctr -n k8s.io i import fannel-cni-plugin_v1.6.2-flannel1.tar
ctr -n k8s.io i import fannel_v0.26.4.tar
ctr -n k8s.io i import kubernetesui_dashboard_v2.7.0.tar
ctr -n k8s.io i import kubernetesui_metrics-scraper_v1.0.8.tar
3.3. 【主节点】初始化k8s
生成默认配置文件 init.default.yaml
# 导出默认配置
kubeadm config print init-defaults > init.default.yaml
修改配置文件内容
(1)将 localAPIEndpoint.advertiseAddress 改为本机地址
(2)将 nodeRegistration.name 改为 master,如果是节点则改为node-1、node-2
(3)将 kubernetesVersion 改为1.32.1
(4)为 networking 添加 podSubnet 值10.244.0.0/16
# 指定配置文件初始化,很多人会把镜像源改成国内的镜像源或者进行配置优化
kubeadm init --config=init.default.yaml
修改国内镜像源方法放在附录
初始化完成后会有一段提示,我在这里完整放在这里
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [k8s-node kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.38.131]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [k8s-node localhost] and IPs [192.168.38.131 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [k8s-node localhost] and IPs [192.168.38.131 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "super-admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests"
[kubelet-check] Waiting for a healthy kubelet at http://127.0.0.1:10248/healthz. This can take up to 4m0s
[kubelet-check] The kubelet is healthy after 501.862065ms
[api-check] Waiting for a healthy API server. This can take up to 4m0s
[api-check] The API server is healthy after 45.000997586s
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node k8s-node as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node k8s-node as control-plane by adding the taints [node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: kwy8f7.w2psm0sfq25uv1y6
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxyYour Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou 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.38.131:6443 --token kwy8f7.w2psm0sfq25uv1y6 \--discovery-token-ca-cert-hash sha256:aab53eda3ba7a646e6a938ebb8a9741c63adbc0aeba41649eed68b044bf4f7aa
3.4. 【主节点】配置K8S配置文件
常规用户
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
root用户,在/root/.bashrc文件最后添加内容如下
export KUBECONFIG=/etc/kubernetes/admin.conf
3.5. 【所有节点】安装fannel
所有节点引入镜像
ctr -n k8s.io i import fannel_v0.26.4.tar
ctr -n k8s.io i import fannel-cni-plugin_v1.6.2-flannel1.tar
主节点发布Fannel
# 使用离线安装包中的配置文件进行安装,文件名为kube-fannel.yml
kubectl apply -f kube-fannel.yml
# 根据配置文件删除容器
kubectl delete -f kube-fannel.yml
3.6. 【子节点】注册节点
# 获取创建节点注册token
kubeadm token create --print-join-command
# 注册子节点
kubeadm join 192.168.38.128:6443 --token kwy8f7.w2psm0sfq25uv1y6 \--discovery-token-ca-cert-hash sha256:aab53eda3ba7a646e6a938ebb8a9741c63adbc0aeba41649eed68b044bf4f7aa
3.7. 【主节点】查看K8S运行情况
# 查看节点情况
kubectl get node
# 查看pod运行情况
kubectl get pod -A
3.8. 【所有节点】安装Dashboard
所有节点引入镜像
ctr -n k8s.io i import kubernetesui_dashboard_v2.7.0.tar
ctr -n k8s.io i import kubernetesui_metrics-scraper_v1.0.8.tar
配置文件需要检查两部分
检查端口
检查容器拉取策略,默认是Always,安装离线镜像需要调整为IfNotPresent
主节点发布Dashboard
# 使用离线安装包中的配置文件进行安装,此处我将文件名改为了k8s-dashboard-2.7.0.yaml
kubectl apply -f k8s-dashboard-2.7.0.yaml
# 常用命令
# 根据配置文件删除容器,这点和docker-compose类似
kubectl delete -f k8s-dashboard-2.7.0.yaml
访问地址
4. 附录
4.1. k8s初始化设置为国内镜像源
很多小伙伴希望运行k8s时候自动拉取国内镜像源的包,这里简单介绍下步骤
- 重置K8S配置
kubeadm reset
- 导出K8S默认配置
kubeadm config print init-defaults > init.default.yaml
-
修改镜像源地址,改为k8s.mirror.nju.edu.cn,此处我重命名文件为 init.cn.yaml
-
完整配置如下
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.38.128bindPort: 6443
nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sockimagePullPolicy: IfNotPresentimagePullSerial: truename: nodetaints: null
timeouts:controlPlaneComponentHealthCheck: 4m0sdiscovery: 5m0setcdAPICall: 2m0skubeletHealthCheck: 4m0skubernetesAPICall: 1m0stlsBootstrap: 5m0supgradeManifests: 5m0s
---
apiServer: {}
apiVersion: kubeadm.k8s.io/v1beta4
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
etcd:local:dataDir: /var/lib/etcd
imageRepository: k8s.mirror.nju.edu.cn
kind: ClusterConfiguration
kubernetesVersion: 1.32.1
networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12podSubnet: 10.244.0.0/16
proxy: {}
scheduler: {}
- 重新初始化
# 初始化命令
kubeadm init --config=init.cn.yaml
- 一些小问题的解决
之前提到使用国内镜像源后,coredns/coredns的镜像源会自动变成coredns,因此我们需要手动下载这个镜像并重命名
# 拉取镜像
ctr -n k8s.io i pull k8s.mirror.nju.edu.cn/coredns/coredns:v1.11.3
# 重新tag
ctr -n k8s.io i tag k8s.mirror.nju.edu.cn/coredns/coredns:v1.11.3 k8s.mirror.nju.edu.cn/coredns:v1.11.3
4.2. kubelet节点NotReady,报错cni plugin not initialized
- 安装工具net-tools
apt-get install net-tools
- 删除cni配置文件
ifconfig cni0 down
ip link delete cni0
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
- 手动创建cni配置文件
cat <<EOL > /etc/cni/net.d/10-flannel.conflist
{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]
}
EOL
- 重启kubelet
systemctl restart kubelet
- 验证启动
kubectl get nodes -A
4.3. kube-fannel-ds-mcmxd容器提示CrashLoopBackOff
- 检查当前pod状态
kubectl get pod -A
2. 检查Flannel的pod日志
kubectl describe pod kube-flannel-ds-mcmxd -n kube-flannel
信息里面会出现如下信息,可以看到Containers—>kube-flannel—>Last State部分信息提示,最近一次状态是Error
3. 查看容器日志
kubectl logs kube-flannel-ds-mcmxd -n kube-flannel --all-containers
这里找到了问题所在,提示我们
Error registering network: failed to acquire lease: node "master" pod cidr not assigned
- 解决方案,此处我的k8s已经初始化结束,只用了第二步就修复了这个问题
(1) 系统安装前的操作:kubeadm初始化指定 --pod-network-cidr参数
通过指令初始化
kubeadm init --pod-network-cidr=10.244.0.0/16
通过配置文件初始化,需要手动添加 networking.podSubnet部分
(2)系统运行时的操作:修改kubernetes控制平面节点配置
修改 /etc/kubernetes/manifests/kube-controller-manage.yaml 文件,在command中添加 –allocate-node-cidrs=true 和 –cluster-cidr=10.244.0.0/16 两项配置,修改后内容如下
apiVersion: v1
kind: Pod
metadata:creationTimestamp: nulllabels:component: kube-controller-managertier: control-planename: kube-controller-managernamespace: kube-system
spec:containers:- command:- kube-controller-manager- --allocate-node-cidrs=true- --cluster-cidr=10.244.0.0/16- --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf- --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf- --bind-address=127.0.0.1- --client-ca-file=/etc/kubernetes/pki/ca.crt- --cluster-name=kubernetes- --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt- --cluster-signing-key-file=/etc/kubernetes/pki/ca.key- --controllers=*,bootstrapsigner,tokencleaner- --kubeconfig=/etc/kubernetes/controller-manager.conf- --leader-elect=true- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt- --root-ca-file=/etc/kubernetes/pki/ca.crt- --service-account-private-key-file=/etc/kubernetes/pki/sa.key- --use-service-account-credentials=trueimage: registry.k8s.io/kube-controller-manager:v1.32.1imagePullPolicy: IfNotPresentlivenessProbe:failureThreshold: 8httpGet:host: 127.0.0.1path: /healthzport: 10257scheme: HTTPSinitialDelaySeconds: 10periodSeconds: 10timeoutSeconds: 15name: kube-controller-managerresources:requests:cpu: 200mstartupProbe:failureThreshold: 24httpGet:host: 127.0.0.1path: /healthzport: 10257scheme: HTTPSinitialDelaySeconds: 10periodSeconds: 10timeoutSeconds: 15volumeMounts:- mountPath: /etc/ssl/certsname: ca-certsreadOnly: true- mountPath: /etc/ca-certificatesname: etc-ca-certificatesreadOnly: true- mountPath: /usr/libexec/kubernetes/kubelet-plugins/volume/execname: flexvolume-dir- mountPath: /etc/kubernetes/pkiname: k8s-certsreadOnly: true- mountPath: /etc/kubernetes/controller-manager.confname: kubeconfigreadOnly: true- mountPath: /usr/local/share/ca-certificatesname: usr-local-share-ca-certificatesreadOnly: true- mountPath: /usr/share/ca-certificatesname: usr-share-ca-certificatesreadOnly: truehostNetwork: truepriority: 2000001000priorityClassName: system-node-criticalsecurityContext:seccompProfile:type: RuntimeDefaultvolumes:- hostPath:path: /etc/ssl/certstype: DirectoryOrCreatename: ca-certs- hostPath:path: /etc/ca-certificatestype: DirectoryOrCreatename: etc-ca-certificates- hostPath:path: /usr/libexec/kubernetes/kubelet-plugins/volume/exectype: DirectoryOrCreatename: flexvolume-dir- hostPath:path: /etc/kubernetes/pkitype: DirectoryOrCreatename: k8s-certs- hostPath:path: /etc/kubernetes/controller-manager.conftype: FileOrCreatename: kubeconfig- hostPath:path: /usr/local/share/ca-certificatestype: DirectoryOrCreatename: usr-local-share-ca-certificates- hostPath:path: /usr/share/ca-certificatestype: DirectoryOrCreatename: usr-share-ca-certificates
status: {}
在 Kubernetes 集群中,Flannel 是一个常用的网络插件,用于提供容器之间的网络连接。Flannel 通过为每个节点分配一个子网并配置网络地址转换(NAT)来实现容器网络的隔离和通信。
当你在 Kubernetes 控制平面节点上修改 kube-controller-manager 配置,确保启用了 --allocate-node-cidrs=true 和 --cluster-cidr=10.244.0.0/16,这对 Flannel 的成功运行至关重要。以下是详细的原因和解释:
- –allocate-node-cidrs=true
这个参数告诉 Kubernetes 控制平面节点(特别是 kube-controller-manager)启用自动为每个节点分配 CIDR(子网)块的功能。
–allocate-node-cidrs=true 启用后,Kubernetes 会在集群初始化时为每个节点分配一个专用的 IP 子网。这个子网会被分配给该节点上所有运行的 Pod。
Flannel 作为网络插件,会使用这些子网来为容器分配 IP 地址。Flannel 会确保每个 Pod 获得唯一的 IP 地址,避免与其他 Pod 或节点的 IP 地址冲突。 - –cluster-cidr=10.244.0.0/16
–cluster-cidr 设置 Kubernetes 集群的 Pod 网络地址范围。在你的例子中,–cluster-cidr=10.244.0.0/16 设置了集群的 Pod 网络地址池为 10.244.0.0/16。这意味着所有的 Pod 地址将从这个范围内分配。
Flannel 需要知道这个地址范围,以便能够正确地为每个节点分配子网。每个节点的子网必须来自这个范围,Flannel 会确保每个节点的 IP 地址分配不会冲突。
如果 --cluster-cidr 设置不正确,Flannel 无法为 Pod 正确分配 IP 地址,导致 Pod 无法通信。
4.4. 子节点无权查看pod内容
搭建完k8s环境后,子节点用户默认是没有查看pod权限的,运行查看命令会报错 pods is forbidden
root@k8s-node:/opt/software/kubernetes/config# kubectl get po -A
Error from server (Forbidden): pods is forbidden: User "system:node:k8s-node" cannot list resource "pods" in API group "" at the cluster scope: can only list/watch pods with spec.nodeName field selector
- 在主节点上创建节点角色配置(根据需求配置权限,生产环境一定要遵循最少权限原则),此处命名为ClusterRole.yaml,内容如下:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: node-manage-pods
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
引入角色
kubectl apply -f ClusterRole.yaml
- 在主节点上创建用户角色绑定配置,此处命名为NodeRoleBinding.yaml,内容如下:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: node-manage-pods-binding
subjects:
- kind: Username: system:node:k8s-nodeapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: node-manage-podsapiGroup: rbac.authorization.k8s.io
绑定用户和角色
kubectl apply -f NodeRoleBinding.yaml
- 登上子节点服务器,查看kubectl get po -A
相关文章:
ubuntu22.04离线安装K8S
1. 准备离线安装包 参考教程离线包准备教程 2. 准备环境 2.1. 准备主机 主机名ip系统k8s-master192.168.38.128ubuntu22.04k8s-node192.168.38.131ubuntu22.04 2.2. 设置host 修改 /etc/hosts 文件,添加master和node节点,需要和主机名保持一致 2…...
985本硕,网络安全方向,走算法还是走开发?
今天给大家分享的是一位粉丝的提问,985本硕,网络安全方向,走算法还是走开发? 接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问: 985本硕ÿ…...
如何清理 Linux 缓存 ?
和其他操作系统一样,Linux 使用缓存来优化系统性能。随着时间的推移,这些缓存可能会累积起来,尽管 Linux 擅长管理内存,但在某些情况下,手动清除可能是有益的,例如用于系统诊断、应用程序性能测试或其他特定…...
cv2库的使用及图像预处理02
目录 八,图像缩放 1. 图像缩放操作 2. 插值方法 (1)最邻近插值(cv2.INTER_NEAREST) (2)双线性插值(cv2.INTER_LINEAR) 3. 显示缩放结果 4. 目标尺寸 5. 总结 九,线性灰度变…...
硬件学习笔记--45 电磁兼容试验-9 无线电干扰抑制试验介绍
目录 电磁兼容试验- 无线电干扰抑制试验 1.试验目的 2.试验方法 3.判定依据及意义 电磁兼容试验- 无线电干扰抑制试验 驻留时间是在规定频率下影响量施加的持续时间。被试设备(EUT)在经受扫频频带的电磁影响量或电磁干扰的情况下&a…...
P1464 Function(记忆化递归)
#include <bits/stdc.h> using namespace std;#define ll long longll dp[21][21][21]; // dp数组,用来记忆已经计算过的结果ll w(ll a, ll b, ll c) {if (a < 0 || b < 0 || c < 0) {return 1;}if (a > 20 || b > 20 || c > 20) {return …...
OpenCV机器学习(7)人工神经网络 定义模型训练过程中参数的搜索范围cv::ml::ParamGrid 类
OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::ParamGrid 类是 OpenCV 机器学习模块中的一个辅助类,用于定义模型训练过程中参数的搜索范围。它通常被用作某些机器学习算法(如支持向量机 SVM&…...
STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(一)
目录 一、B2109 统计数字字符个数 - 洛谷 算法代码: 1. 引入库和命名空间 2. 主函数 3. 读取输入 4. 变量初始化 5. 遍历字符串 6. 输出结果 7. 返回值 总结 评测记录: 二、B2110 找第一个只出现一次的字符 - 洛谷 方法一:算法代…...
游戏引擎学习第107天
仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾我们之前停留的位置 在这段内容中,讨论了如何处理游戏中的三维效果,特别是如何处理额外的“Z层”。由于游戏中的艺术资源是位图而不是3D模型,因此实现三维效果变得非常具有挑战性。虽然可…...
网页制作01-html,css,javascript初认识のhtml的基本标记
一、 Html简介 英文全称是 hyper text markup language,超文本标记语言,是全球广域网上描述网页内容和外观的标准. Html作为一款标记语言,本身不能显示在浏览器中.标记语言经过浏览器的解释和编译,才能正确地反映html标记语言的内容. 1.html 的基本标记 1)头部标…...
WebSocket在分布式环境中的局限性及解决方案
WebSocket 在分布式环境中存在一些局限性,特别是当系统需要扩展多个服务实例时,单个 WebSocket 连接的管理和消息推送就变得比较复杂。因此,必须采取一些额外的措施来确保 WebSocket 能在多个服务实例之间正确工作。 WebSocket 在分布式环境…...
Windows日志分析
查看服务日志文件 windows下我们可以通过时间查看器来查看windows系统下服务,应用,系统等产生的事件以及日志 1.打开方式是: winr 输入eventvwr.msc 2.控制面板--系统与安全--事件查看器 事件类型分为5种 错误:标识问题很严重…...
青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试
青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试 一、软件测试二、自动化测试三、单元测试四、Django 单元测试(一)、创建测试用例(二)、运行测试(三)、常用测试功能 课题摘要: 本文全面介绍了软件…...
WPF 中为 Grid 设置背景图片全解析
WPF 中为 Grid 设置背景图片全解析 在 WPF(Windows Presentation Foundation)开发中,界面的美观度是吸引用户的重要因素之一。而添加背景图片是提升界面视觉效果的常见手段。今天,我们就来深入探讨在 WPF 里如何为 Grid 设置背景…...
3.10 实战Hugging Face Transformers:从文本分类到模型部署全流程
实战Hugging Face Transformers:从文本分类到模型部署全流程 一、文本分类实战:IMDB电影评论情感分析 1.1 数据准备与预处理 from datasets import load_dataset from transformers import AutoTokenizer # 加载IMDB数据集 dataset = load_dataset("imdb") …...
Android中获取so文件来源于哪个库
Android app中可能有很多的.so文件,有时我们不确定这些.so文件都是来源于哪些库的,可以通过在build.gradle中添加代码来统计。具体方法如下: 1.在com.android.application模块的build.gradle文件最后添加如下代码: // 获取所有的…...
地面沉降监测,为地质安全保驾护航
地面沉降,不容忽视的城市隐患 随着城市化进程的加速,大规模的工程建设、地下水过度开采等因素,导致地面沉降现象日益严重。地面沉降不仅会使建筑物开裂、倾斜,影响其使用寿命和安全性,还会破坏地下管线,引…...
宝塔docker 安装oracle11G
1、拉取镜像 sudo docker pull iatebes/oracle_11g #iatebes为用户名2、查看镜像 sudo docker images3、创建并运行容器 docker run -d --privileged --name oralce11g -p 1521:1521 iatebes/oracle_11g4、登录到容器 5、进入容器并修改system用户密码 docker exec -it orac…...
unity学习39:连续动作之间的切换,用按键控制角色的移动
目录 1 不同状态之间的切换模式 1.1 在1个连续状态和一个连续状态之间的transition,使用trigger 1.2 在2个连续状态之间的转换,使用bool值切换转换 2 至少现在有2种角色的移动控制方式 2.1 用CharacterController 控制角色的移动 2.2 用animator…...
DeepSeek等大模型功能集成到WPS中的详细步骤
记录下将**DeepSeek功能集成到WPS中**的步骤,以备忘。 1. 下载并安装OfficeAI插件 访问OfficeAI插件下载地址:https://www.office-ai.cn/,下载插件(目前只支持windows系统)。 注意,有两个插件࿰…...
基于Python的Flask微博话题舆情分析可视化系统
✅️配套lun文 1w9字 ✅️爬虫可用 12月数据 ✅️实时微博热点分析 技术栈:爬虫➕Flask后端框架➕bert深度学习模型➕mysql数据库系统功能:爬取微博数据(可以是同类型文章或者制定文章),微博文章情感分析,微博评论情感…...
服务器A到服务器B免密登录
#!/bin/bash # 变量定义 source_host"192.168.42.250" # 源主机 IP target_host"192.168.24.43" # 目标主机 IP target_user"nvidia" # 目标主机的用户名 ssh_port"6666" # SSH 端口号 # 生成 SSH…...
Unity中可靠的UDP实现
可靠 UDP(Reliable UDP)是一种在用户数据报协议(UDP)基础上,通过添加额外机制来实现可靠数据传输的技术。与传统 UDP 相比,它克服了 UDP 本身不保证数据可靠性、顺序性以及可能丢失数据的缺点,同…...
轮播图html
题十二:轮播图 要求: 1.鼠标不在图片上方时,进行自动轮播,并且左右箭头不会显示;当鼠标放在图片上方时,停止轮播,并且左右箭头会显示; 2.图片切换之后,图片中下方的小圆…...
二十多年前的苹果电源Power Mac G4 Mdd 电源接口
在1999年,苹果推出了最初的Power Mac G4电脑。第一代Power Mac G4有与G3系列相似的外壳和两种主板设置,分别使用PCI和AGP显示总线。第二代电脑被昵称为快银或水银机,来自2001年的它们有更高速的PowerPC 7450系列芯片,增强了L2缓存…...
java听书项目
项目的架构 网关:1路由转发 2.认证鉴权(token)3.统一处理(跨域) Mysql:关系型数据库 ES:搜索数据库 Redis:页面级缓存,会话状态存储 GitLab:私有托管平台 K8S:自动化部署、扩展和管理容器化应用程序的开源系统 Jenkins:自动化部署 1.环境搭建 创建一个父工程…...
RadASM环境,win32汇编入门教程之三
;运行效果 ;win32汇编环境,RadAsm入门教程之三 ;在这个教程里,我们学一下如何增加控件,比如按钮,其它的控件类似这样增加 ;以下的代码就是在教程一的窗口模版里增加一个按钮控件,可以比较一下,增加了什么内…...
【机器学习】线性回归 多元线性回归
【机器学习系列】 KNN算法 KNN算法原理简介及要点 特征归一化的重要性及方式线性回归算法 线性回归与一元线性回归 线性回归模型的损失函数 多元线性回归 多项式线性回归 多元线性回归 V1.0多元线性回归一元线性回归与多元线性回归多元线性回归模型的误差衡量多元线性回归的最…...
线性代数中的正交和标准正交向量
在线性代数中,理解正交向量和正交向量至关重要,尤其是对于机器学习中的应用。这篇博文将简化这些概念,而不会太深入地深入研究复杂的数学。 正交向量 如果两个向量的点积等于零,则认为这两个向量是正交的。但点积到底是什么呢&am…...
Vue 项目登录的基本流程
Vue 用户登录的基本流程包括以下6个步骤: 步骤: 1. 创建登录表单 在前端,首先要创建一个登录表单,用户输入账号(用户名、邮箱、手机号等)和密码。 示例:Login.vue <template><div…...
坐井说天阔---DeepSeek-R1
前言 DeepSeek-R1这么火,虽然网上很多介绍和解读,但听人家的总不如自己去看看原论文。于是花了大概一周的时间,下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…...
Spring 是如何解决循环依赖问题的?
Spring框架通过使用三级缓存机制来解决单例Bean之间的循环依赖问题。以下是详细的解释,包括循环依赖的概念、Spring的解决方案以及三级缓存的具体作用。 什么是循环依赖? 循环依赖是指两个或多个Bean之间相互依赖,形成一个闭环。例如&#…...
【数据可视化-17】基于pyecharts的印度犯罪数据可视化分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
thingboard告警信息格式美化
原始报警json内容: { "severity": "CRITICAL","acknowledged": false,"cleared": false,"assigneeId": null,"startTs": 1739801102349,"endTs": 1739801102349,"ackTs": 0,&quo…...
Javaweb中,使用Servlet编写简单的接口
案例:网页提交用户名和密码信息,后端校验密码长度需在6-12位之间 后端部分 WebServlet("/valid") public class SimpleServlet extends HttpServlet{public void service(HttpServletRequest req, HttpServletResponse resp) throws IOExcepti…...
三层渗透测试-DMZ区域 二三层设备区域
DMZ区域渗透 信息收集 首先先进行信息收集,这里我们可以选择多种的信息收集方式,例如nmap如此之类的,我的建议是,可以通过自己现有的手里小工具,例如无影,密探这种工具,进行一个信息收集。以免…...
Java 开发者需要了解的 PDF 基础知识
PDF 代表“可移植文档格式”(Portable Document Format),它是全球最流行的文件格式。因此,Java 开发人员很可能会经常需要处理它。然而,与 Microsoft Word 或 HTML/XML 这样的格式相比,PDF 并不那么直观。理…...
基于图像处理的裂缝检测与特征提取
一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…...
Webpack 基础入门
一、Webpack 是什么 Webpack 是一款现代 JavaScript 应用程序的静态模块打包工具。在 Web 开发中,我们的项目会包含各种类型的文件,如 JavaScript、CSS、图片等。Webpack 可以将这些文件打包成一个或多个文件,以便在浏览器中高效加载。它就像…...
掌握SQLite_轻量级数据库的全面指南
1. 引言 1.1 SQLite简介 SQLite 是一个嵌入式关系型数据库管理系统,它不需要单独的服务器进程或系统配置。它的设计目标是简单、高效、可靠,适用于各种应用场景,尤其是移动设备和嵌入式系统。 1.2 为什么选择SQLite 轻量级:文件大小通常在几百KB到几MB之间。无服务器架构…...
大数据处理如何入门
大数据处理的入门可以从以下几个方面入手: 1. 基础知识学习 在深入大数据领域之前,建议先掌握一些基础知识,包括数据类型、存储与处理的基本概念,以及常用的数据处理工具。例如,Python或Java编程语言在大数据领域应用…...
算法与数据结构(最小栈)
题目 思路 为了返回栈中的最小元素,我们需要额外维护一个辅助栈 min_stack,它的作用是记录当前栈中的最小值。 min_stack的作用: min_stack的栈顶元素始终是当前栈 st 中的最小值。 每当st中压入一个新元素时,如果这个元素小于等…...
LeetCode 1287.有序数组中出现次数超过25%的元素:遍历
【LetMeFly】1287.有序数组中出现次数超过25%的元素:遍历 力扣题目链接:https://leetcode.cn/problems/element-appearing-more-than-25-in-sorted-array/ 给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出…...
春招项目=图床+ k8s 控制台(唬人专用)
1. 春招伊始 马上要春招了,一个大气的项目(冲击波项目)直观重要,虽然大家都说基础很重要,但是一个足够新颖的项目完全可以把你的简历添加一个足够闪亮的点。 这就不得不推荐下我的 k8s 图床了,去年折腾快…...
Vue 记录用户进入页面的时间、离开页面的时间并计算时长
在 Vue 项目中,要记录用户进入页面的时间、离开页面的时间,并在用户离开时计算时长并调用后端接口,可以借助 Vue 的生命周期钩子和浏览器的一些事件来实现。以下是具体的实现步骤和示例代码: 实现思路 记录进入时间:…...
解锁豆瓣高清海报(三)从深度爬虫到URL构造,实现极速下载
脚本地址: 项目地址: Gazer PosterBandit_v2.py 前瞻 之前的 PosterBandit.py 是按照深度爬虫的思路一步步进入海报界面来爬取, 是个值得学习的思路, 但缺点是它爬取慢, 仍然容易碰到豆瓣的 418 错误, 本文也会指出彻底解决旧版 418 错误的方法并提高爬取速度. 现在我将介绍…...
机器学习--逻辑回归
机器学习–逻辑回归 一、认知革命:从线性回归到逻辑回归 1.1 本质差异对比 维度线性回归逻辑回归输出类型连续值概率值 (0-1)目标函数最小二乘法极大似然估计数学表达式 y w T x b yw^Txb ywTxb p 1 1 e − ( w T x b ) p\frac{1}{1e^{-(w^Txb)}} p1e−(wTxb…...
gradio创建openai前端对接deepseek等模型流式输出markdown格式文本
环境 gradio3.50.2 openai1.63.1代码 import openai import gradio as gr#导入gradio的包api_key "sk-**a8" api_base "https://api.deepseek.com/v1"import gradio as gr import openai from typing import List, Any, Iteratorclient openai.OpenAI…...
【LeetCode Hot100】最大子数组和|动态规划/贪心,Java实现!图解+代码,小白也能秒懂!
💻 [LeetCode Hot100] 最大子数组和|动态规划/贪心,Java实现!图解代码,小白也能秒懂! ✏️本文对应题目链接:最大子数组和 📌 题目描述 给定一个整数数组 nums,找到一个…...
【Go语言快速上手】第二部分:Go语言进阶之网络编程
文章目录 前言:网络编程一、TCP/UDP 编程:net 包的使用1. TCP 编程1.1 TCP 服务器1.2 TCP 客户端 2. UDP 编程2.1 UDP 服务器2.2 UDP 客户端 二、HTTP 编程:net/http 包的使用,编写 HTTP 服务器和客户端2.1 HTTP 服务器2.2 HTTP 客…...