K8S及Rancher部署
前言
这篇文写的有点子啰嗦,甚至为了控制篇幅我还分出了其他好几篇文章,只在本文中保留了我认为必须存在。而之所以篇幅这么长,一方面是我在相关领域完全新手,啥啥都不会;而另一方面是我所参考的资料都过于精简,以至于遇到点问题,我就这是啥啊这是的大惊小怪;还有就是我偶发性的莫名其妙的头铁,以至于本应在前置解决的问题,但因为参考资料语焉不详,我选择性略过,已至于后期在bug里沉沦(写文顺序经过调整,如果看到不这样就会报啥错类似的话,那就是我在这里已经踩过坑了)。不过好在经过时间的洗礼,我也总算是取得了阶段性的胜利!
前置准备工作
SSH命令
SSH相关-CSDN博客
vi文本编辑器
vi文本编辑器基础知识-CSDN博客
linux 命令
Linux/Unix命令-CSDN博客
tmux 命令
tmux
是一个开源的终端复用器,用于在一个窗口中访问多个独立的终端会话。它允许用户在多个虚拟终端、窗口和窗格之间分割屏幕,并且可以轻松地在它们之间切换。tmux
还支持会话的持久化,这意味着即使关闭终端或重启系统,你的工作会话也可以被保存和恢复。
tmux 命令-CSDN博客
安装docker
更新现有的包列表:
apt update
apt-get update
这一步有可能会如图
报错:
Err:1 https://mirrors.tuna.tsinghua.edu.cn/debian bullseye InReleaseCannot initiate the connection to mirrors.tuna.tsinghua.edu.cn:443 (2402:f000:1:400::2). - connect (101: Network is unreachable) Could not connect to mirrors.tuna.tsinghua.edu.cn:443 (101.6.15.130), connection timed out
Err:2 https://mirrors.tuna.tsinghua.edu.cn/debian bullseye-updates InReleaseCannot initiate the connection to mirrors.tuna.tsinghua.edu.cn:443 (2402:f000:1:400::2). - connect (101: Network is unreachable)
Err:3 https://mirrors.tuna.tsinghua.edu.cn/debian bullseye-backports InReleaseCannot initiate the connection to mirrors.tuna.tsinghua.edu.cn:443 (2402:f000:1:400::2). - connect (101: Network is unreachable)
Err:4 https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security InReleaseCannot initiate the connection to mirrors.tuna.tsinghua.edu.cn:443 (2402:f000:1:400::2). - connect (101: Network is unreachable)
遇到这个错误先ping一下查看网络情况,是否可用
好样的,ping不通,先解决网络问题再继续往下吧
网络问题修复好,先重启下网络服务
systemctl restart networking.service
查看下网络路由表 ,就可以继续往下安装了
route -n
安装必要软件包
apt install apt-transport-https ca-certificates gnupg2 lsb-release
apt-get install apt-transport-https ca-certificates gnupg2 lsb-release
这一步我的错误在这里:
gnupg : Depends: gpgv (< 2.2.27-2+deb11u2.1~) but 2.2.40-1.1 is to be installed
E: Unable to correct problems, you have held broken packages.
所以就直接卸载掉了不兼容的 gpgv,安装gnupg2。卸载语句:
apt-get remove gpgv
添加Docker的GPG密钥:
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpgchmod a+r /etc/apt/keyrings/docker.gpgecho \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian \"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \tee /etc/apt/sources.list.d/docker.list > /dev/null
最后安装
apt-get updateapt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动Docker服务:
systemctl start docker
设置Docker服务开机自启动:
systemctl enable docker
验证Docker安装:
docker --version# Docker version 27.0.3, build 7d4bcd8
修改docker管理系统cgroup的方式为systemd
docker、Containerd的cgroup和k8s一致才能正常安装启动k8s
vi /etc/docker/daemon.json# 编辑文件,增加内容--确保文件格式正确,必要时可以使用JSON工具格式化
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://asia-northeast1-docker.pkg.dev"]
}# 重启docker
systemctl restart docker# 或
systemctl daemon-reload && systemctl restart docker
参考:
docker-ce | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
k8s+Docker部署方法
Containerd配置
安装docker时,已安装containerd.io
生成默认配置
containerd config default > /etc/containerd/config.toml
修改CgroupDriver为systemd
vi /etc/containerd/config.toml# [...]
# [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
# [...]
# SystemdCgroup = true
换国内镜像源
# 编辑containerd配置文件
vi /etc/containerd/config.toml# 编辑内容--换国内源
[plugins."io.containerd.grpc.v1.cri"]...sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8"# 没有换源可能导致systemctl status kubelet.service输出
# couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused这类错误
#用journalctl -u kubelet 进一步检查输出:【RunPodSandbox from runtime service failed" err="rpc error: code = Unknown desc = failed to get sandbox image】
# 沙盒镜像获取失败,此时需要换成国内源
重启containerd
# 重启
systemctl restart containerd# 设置开机启动
systemctl enable containerd --now # 查看
systemctl status containerd
安装k8s相关
安装kubeadm
在 Debian 12 和 Ubuntu 22.04 之前的版本中,/etc/apt/keyrings
默认情况下不存在;您可以创建该目录(我的系统不需要)
mkdir -p -m 755 /etc/apt/keyrings# mkdir: 这是创建新目录的命令。# -p: 这个选项告诉 mkdir 如果目录的上级目录不存在的话,应该一并创建它们。这样,即使目标目录的路径中包含了不存在的目录,命令也不会报错。
-m: 这个选项后面跟随的参数用来设置新创建目录的权限。
755: 这是一个八进制数,用来设置文件或目录的权限。在这种情况下,它表示目录所有者具有读、写和执行权限(7),组用户和其他用户具有读和执行权限(5)。#这个命令通常在安装软件包或添加新的软件源之前使用,以确保有正确的权限设置,APT 可以访问这些密钥环。
下载用于 Kubernetes 软件包仓库的公共签名密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
添加 Kubernetes apt
仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
更新 apt
包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
apt-get updateapt-get install -y kubelet kubeadm kubectlapt-mark hold kubelet kubeadm kubectl# apt-mark hold 命令用于将指定的软件包标记为“hold”,这意味着这些软件包将不会被自动更新。这对于你想要固定在当前版本的软件包非常有用,比如在 Kubernetes 集群中,你可能想要保持 kubelet、kubeadm 和 kubectl 的版本一致,以避免自动更新可能导致的兼容性问题。
查看kubeadm config init和join的默认配置
kubeadm config print init-defaultskubeadm config print join-defaults
生成 kubeadm-config,并修改配置参数
# 生成默认配置
kubeadm config print init-defaults > kubeadm-config.yaml# 查看编辑kubeadm-config.yaml
vi kubeadm-config.yaml# 增加或修改cgroup配置
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs# 重启
systemctl daemon-reload && systemctl restart kubelet# 验证配置
kubelet --version
kubeadm-config配置
查看系统支持的cgroup版本
grep cgroup /proc/filesystems# nodev cgroup
# cgroup2
关闭交换空间
# 检查交换空间状态
swapon --show# 如果启用了交换空间,你可以使用以下命令临时关闭
swapoff -a# /etc/fstab 中的交换空间条目
vi /etc/fstab# 注释掉类似下面这句话
#UUID=xxxx-xxxx-xxxx-xxxx none swap sw 0 0# 禁用 systemd 的交换空间管理器
systemctl mask swap.target# 检查交换空间状态
swapon --show# kubeadm init前关闭交换空间,不需要往下执行-------------------------------------------------# 如果kubeadm初始化失败,systemctl status kubelet.service输出【command failed" err="failed to run Kubelet: running with swap on is not supported, please"】进行下面步骤
# 重启
systemctl daemon-reload
systemctl restart kubelet.service# 检查kubelet.service
systemctl status kubelet.service
开放必要端口
iptables -A INPUT -p tcp -m multiport --dports 6443,2379,2380,10250 -j ACCEPT# 查看
iptables -L
初始化集群
# 清空kubeadm集群(如果有init失败,需要先清空)
kubeadm reset
rm -rf /var/lib/kubernetes# 拉取镜像(在这里失败,解决方法是将kubeadm-config.yaml文件中的镜像地址改为本地阿里云地址)
kubeadm config images pull --config kubeadm-config.yaml# 初始化kubeadm集群
kubeadm init --config kubeadm-config.yaml
查看kublet文件(看不看都行)
# 编辑
vi /var/lib/kubelet/config.yaml# 查看
cat /usr/lib/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 --config=/var/lib/kubelet/config.yaml
Restart=always
StartLimitInterval=0
RestartSec=10[Install]
WantedBy=multi-user.target
初始化成功:
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/.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/You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:kubeadm join 192.168.xx.xxx:6443 --token p8u7wj.188l6nd0lw0bbp2r \--discovery-token-ca-cert-hash sha256:bf79f2cfc51dae1662dc91a89d034d71759f536addfadedfa8a3102c70c99d65 \--control-plane Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.xx.xxx:6443 --token p8u7wj.188l6nd0lw0bbp2r \--discovery-token-ca-cert-hash sha256:bf79f2cfc51dae1662dc91a89d034d71759f536addfadedfa8a3102c70c99d65
查看用户是否为root用户
id -u
# 0whoami
# root
root用户直接输入命令:
# 手动设置(例如,使用 export 命令),它们不会自动传播到新的会话。
export KUBECONFIG=/etc/kubernetes/admin.conf
k8s 集群初始化正常,同电脑再开远程窗口通过与初始化正常的链接方式(ssh ip root)链接却访问不到集群的原因:
export KUBECONFIG=/etc/kubernetes/admin.conf
当新窗口echo $KUBECONFIG 输出为空,kubectl config view输出没有相应更新内容而初始化成功窗口输出正常时的原因可能是【如果第一个 SSH 会话可以成功访问 Kubernetes 集群,而在新开启的 SSH 会话中环境变量丢失,即使这两个会话都是以 root 用户身份访问相同的 IP 地址,可能的原因包括】:
-
环境变量作用域: 环境变量可能只在原始会话中设置,并没有被导出到所有子会话。在 Bash 中,如果环境变量是在当前会话中设置的(而不是在
.bashrc
或.profile
中),它将不会影响新开启的会话。 -
SSH 会话配置: SSH 连接可能没有配置为自动加载用户的环境变量。通常,SSH 会话会加载用户的 shell 配置文件,如
.bashrc
或.bash_profile
,如果这些文件中没有正确设置环境变量,它们就不会被加载。 -
手动设置的环境变量: 如果环境变量是在原始 SSH 会话中手动设置的(例如,使用
export
命令),它们不会自动传播到新的会话。 -
不同的 shell: 如果新旧 SSH 会话使用的 shell 类型不同(例如,从 Bash 切换到 zsh 或其他),环境变量的配置方式可能不同。
-
配置文件未被加载: 新 SSH 会话可能没有加载包含环境变量设置的配置文件。
-
权限或策略限制: 某些系统策略或权限设置可能限制了环境变量的传播。
-
SSH Daemon 配置: SSH 服务器的配置可能影响环境变量的传递。
-
使用
sudo
或su
: 如果你是通过sudo
或su
切换到 root 用户,环境变量可能不会被正确继承。
配置 k8s 网络插件
按照初始化完成后的提示安装网络插件,这里选用的是calico
# 使用 wget 命令从提供的 URL 下载 calico.yaml 文件。wget 是一个用于从网络上下载文件的命令行工具。
wget https://docs.projectcalico.org/manifests/calico.yaml # 使用 sed 命令编辑下载的 calico.yaml 文件。
#sed 是一个流编辑器,-i 选项表示直接在原文件上进行编辑。这里的编辑操作是将文件中所有的 192.168.0.0/16 替换为 10.244.0.0/16。
sed -i "s#192\.168\.0\.0/16#10\.244\.0\.0/16#" calico.yaml# 使用 kubectl 命令将编辑后的 calico.yaml 文件应用到 Kubernetes 集群中。
# kubectl 是 Kubernetes 的命令行工具,apply 命令用于应用一个配置文件,-f 选项表示指定要应用的配置文件。
kubectl apply -f calico.yaml# 这段代码使得在下载 calico.yaml 文件后,用户可以方便地对其进行网络配置的修改,然后将其应用到 Kubernetes 集群中。通过这种方式,可以简化部署 Calico 网络插件的过程,并且提高了部署的效率和准确性。
K8S单机部署节点处理
单机版的k8s安装后, 无法部署服务。因为默认master不能部署pod,有污点, 需要去掉污点或者新增一个node,新增node节点客观条件不是很允许,所以这里直接去除污点。
# 查看节点,有输出说明有节点kubectl get node -o yaml | grep taint -A 5# 输出
# taints:# - effect: NoSchedule# key: node-role.kubernetes.io/control-plane# 删除污点,[control-]看上面输出的key路径 kubectl taint nodes --all node-role.kubernetes.io/control-plane-# 查看节点,无输出,污点删除成功kubectl get node -o yaml | grep taint -A 5
安装部署Rancher
创建应用pv
# 创建pv.yaml
vi pv.yaml# 编辑pv.yaml文件
# 详细内容见下方链接# 应用配置
kubectl apply -f pv.yaml# 验证 PV 是否创建成功
kubectl get pv
pv解释以及配置:pv.yaml
安装helm
# 使用脚本安装
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh# 或者直接执行安装(我是直接执行安装失败了,所以才采用上面的方式安装)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash# 添加 Rancher 的 Helm Chart 仓库:(非生产环境,所以使用最新版)
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
安装 ingress
Rancher UI 和 API 通过 Ingress 公开。换言之,安装 Rancher 的 Kubernetes 集群必须包含一个 Ingress Controller。
(✘)使用 Helm安装 (安装失败,忽略,看下一个)
# 创建 Ingress Controller 的命名空间:
kubectl create namespace ingress-nginx# 为 Nginx Ingress Controller 添加 Helm Chart 仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update# 使用 Helm 安装 Nginx Ingress Controller-->安装失败
helm upgrade --install ingress-nginx ingress-nginx \--namespace ingress-nginx \--set controller.replicaCount=2 \--set controller.service.type=LoadBalancer \--set controller.service.externalTrafficPolicy=Local \--set controller.service.externalIPs=192.168.xx.xxx# 换一种方式安装
helm repo list #列出当前配置在 Helm 客户端中的所有 Helm 仓库
helm search repo ingress-nginx #用于在已添加到本地 Helm 客户端的 Helm 仓库中搜索特定的关键字
# 输出ingress-nginx/ingress-nginx 4.11.1 1.11.1 Ingress controller for Kubernetes using NGINX a...
helm pull ingress-nginx/ingress-nginx #从指定的 Helm 仓库下载一个特定的 chart 包到本地
tar -xf ingress-nginx-4.11.1.tgz #提取指定的tar包的文件名
tree ingress-nginx -L 1 #输出显示ingress-nginx 目录下的所有第一级项(文件和目录)
# 输出
ingress-nginx
|-- Chart.yaml
|-- OWNERS
|-- README.md
|-- README.md.gotmpl
|-- changelog
|-- ci
|-- templates
|-- tests
`-- values.yaml# 修改values.yaml(在values.yaml目录下编辑)
cd ingress-nginx
vi values.yaml# install(在Chart.yaml目录下安装)
helm install ingress-nginx -n ingress-nginx .# 检查 Ingress Controller Pod 是否成功部署:
kubectl get pods -n ingress-nginx# 验证 Ingress Controller 服务
kubectl get svc -n ingress-nginx
(✓)使用 YAML 清单安装
# 下载官网的deploy.yaml配置文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/cloud/deploy.yaml# 镜像拉取(使用docker,自己找个国内镜像网站,拉取版本看deploy.yaml配置)
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/controller:v1.11.1docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.1# 给镜像重命名(可省略,亲测就算重命名,不改原始镜像源,仍然ErrImagePull,所以此步可不要)
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/controller:v1.11.1 registry.k8s.io/ingress-nginx/controller:v1.11.1docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.1 registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.1# 编辑下载的deploy.yaml配置文件
vi deploy.yaml# 安装
kubectl apply -f deploy.yaml# 检查 Ingress Controller Pod 是否成功部署:
kubectl get pods -n ingress-nginx# 验证 Ingress Controller 服务
kubectl get svc -n ingress-nginx
我的deploy.yaml配置
安装默认的ingress class
安装一个默认的ingress class很有必要,我在安装Rancher完成后,自定义域名死活访问不到,一查就是缺少一个默认的ingressClass导致的,原因如下:
# rancher安装完成后,查看。写在此处是为了说明安装一个默认的ingress class的必要
kubectl get ingress -A
# NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
# cattle-system rancher <none> rancher.xxx.com 80, 443 18h
生成编辑文件
# 生成class文件
vi ingress-class.yaml# 编辑文件
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:labels:app.kubernetes.io/component: controllername: nginx-ingressannotations:ingressclass.kubernetes.io/is-default-class: "true"
spec:controller: k8s.io/ingress-nginx
安装命令
kubectl apply -f ingress-class.yaml
删除ingress配置(如果有需要的话)
# 删除 deploy.yaml 文件中定义的所有资源
kubectl delete -f deploy.yaml# 清理命名空间
kubectl delete namespace <namespace>
安装 cert-manager
# 添加 Jetstack Helm 仓库
helm repo add jetstack https://charts.jetstack.io# 更新本地 Helm Chart 仓库缓存
helm repo update# 安装 cert-manager Helm Chart
helm install cert-manager jetstack/cert-manager \--namespace cert-manager \--create-namespace \--set installCRDs=true# 验证
kubectl get pods --namespace cert-manager# NAME READY STATUS RESTARTS AGE
# cert-manager-5c6866597-zw7kh 1/1 Running 0 2m
# cert-manager-cainjector-577f6d9fd7-tr77l 1/1 Running 0 2m
# cert-manager-webhook-787858fcdb-nlzsq 1/1 Running 0 2m
(✘&✓)Helm安装rancher
这里先说明一下,我一开始在本地搭建k8s集群,集群的版本是1.30.0版本,使用helm安装Rancher的时候说不兼容,于是直接采用docker安装Rancher,然后导入1.30.0版本集群(集群导入成功!)但是本着来都来了,用都用了,而且docker安装的Rancher一是自带一个k8s集群倒显得我上面的工作有点多余,二是--privileged令我不大开心。于是,我将k8s集群的版本换成1.28.0后又由helm安装了一遍Rancher。这样Rancher就只需要管理我本地的集群就可以啦!这就是标题旁边又是叉又是勾的原因。
不兼容(Error: INSTALLATION FAILED: chart requires kubeVersion: < 1.29.0-0 which is incompatible with Kubernetes v1.30.0)
# 为 Rancher 创建命名空间
kubectl create namespace cattle-system# 创建
helm install rancher rancher-latest/rancher \--namespace cattle-system \--set hostname=rancher.my.org \--set bootstrapPassword=admin
删除cattle-system命名空间
# 列出所有 Helm releases
helm list --all-namespaces# 卸载 Rancher:
helm uninstall rancher -n cattle-system# 清理 Kubernetes 资源(可选)
kubectl get pvc -n cattle-system
kubectl delete pvc <pvc-name> -n cattle-system# 检查网络相关资源:
kubectl get ingress,services,lb -n cattle-system
kubectl delete ingress <ingress-name> -n cattle-system
kubectl delete service <service-name> -n cattle-system# 正常删除失败
kubectl delete namespace cattle-system# 正常删除失败,命名空间Terminating,执行以下命令
kubectl get ns | grep cattle-system # 查看状态
kubectl get namespace cattle-system -o json | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" | kubectl replace --raw /api/v1/namespaces/cattle-system/finalize -f -# 检查遗留的 Secrets:
kubectl get secrets -n cattle-system
kubectl delete secret <secret-name> -n cattle-system# 查看命名空间状态
kubectl get ns | grep cattle-system
kubectl create namespace cattle-system报错: 【Error from server (InternalError): Internal error occurred: failed calling webhook "rancher.cattle.io.namespaces.create-non-kubesystem": failed to call webhook: Post "https://rancher-webhook.cattle-system.svc:443/v1/webhook/validation/namespaces?timeout=10s": service "rancher-webhook" not found】
# 查看rancher.cattle.io
kubectl get MutatingWebhookConfiguration
# NAME WEBHOOKS AGE
# ...
# rancher.cattle.io 7 65m# 查看rancher.cattle.io
kubectl get ValidatingWebhookConfiguration
# NAME WEBHOOKS AGE
...
rancher.cattle.io 18 66m
...# 删除rancher.cattle.io
kubectl delete MutatingWebhookConfiguration rancher.cattle.io# 删除rancher.cattle.io
kubectl delete ValidatingWebhookConfiguration rancher.cattle.io# 再次创建命名空间成功
kubectl create namespace cattle-system
kubectl get pods -n cattle-system输出:rancher-756b4d88d5-6dstl 0/1 CrashLoopBackOff 5 (17s ago) 4m18s
# 获取错误 Pod 的日志
kubectl logs rancher-756b4d88d5-6dstl -n cattle-system
#输出错误信息:[FATAL] clusters.management.cattle.io is forbidden: User "system:serviceaccount:cattle-system:rancher" cannot list resource "clusters" in API group "management.cattle.io" at the cluster scope# 创建文件,绑定角色
rancher-cluster-role-binding.yaml# 文件内容
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: rancher-cluster-binding
subjects:
- kind: ServiceAccountname: ranchernamespace: cattle-system
roleRef:kind: ClusterRolename: cluster-adminapiGroup: rbac.authorization.k8s.io# 应用YAML文件
kubectl apply -f rancher-cluster-role-binding.yaml
helm upgrade 命令更新现有安装(未尝试过,慎重,我一般是卸载重新安装)
# 查看命令
helm get values rancher -n cattle-system# helm upgrade 命令更新现有安装
helm upgrade rancher rancher-latest/rancher \--namespace cattle-system \--set hostname=rancher.my.org \--set bootstrapPassword=admin
使用自定义证书安装
helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname=rancher.lxq.com \
--set bootstrapPassword=admin \
--set ingress.tls.source=secret \
--set privateCA=true
本次在搭建Rancher的本地环境时修改了hosts
文件,手动映射了域名和 IP 地址。这样做可以使用自定义的域名但坏处是如果外部机器想要访问Rancher也需要对域名和ip进行映射。(域名买不起,免费域名也有限制,ngix反向代理啥的,看了看没看懂,所以选择了最简单,最傻瓜的一种)
vi /etc/hosts
[...]
192.168.xxx.xxx rancher.xxx.com
外部访问机器使用了clashX Pro做了代理,因此只修改其配置文件即可,没用代理,修改本机hosts文件也行。(我本次搭建的目的纯纯是为了练手,加上一点点的好奇心,重点不在这里。所以生产环境不要这样哦,不过生产环境肯定也有域名了。这里写这么详细,是因为别人一搭就好了而我在这里徘徊良久......)
# 增加
hosts:"rancher.xxx.com": 192.168.xx.xxx
修改本地hosts文件及外部访问机器本地hosts文件后,rancher UI网站仍然不能访问
k8s集群helm安装rancher
Rancher高可用部署
(✓)Docker 安装Rancher
# 拉取 Rancher 镜像:
docker pull rancher/rancher:latest# 运行 Rancher 容器--端口被占用
docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher:latest# 运行 Rancher 容器
docker run -d --privileged --restart=unless-stopped -p 9088:80 -p 9443:443 rancher/rancher:latest# 登录Rancher
# 打开https://<ip>:9443/dashboard/auth/login,注意一定要是https
# 按照引导登录
# docker ps 查看containerId
# docker logs <containerId> 2>&1 | grep "Bootstrap Password:"生成密码
# 进入引导页,选择随机生成密码:lvRZwoXLldi4Ymsn(自定义密码长度较长,先使用随机密码)
参考
Kubeadm init 错误-API 服务器未运行
安装Kubernetes(k8s)保姆级教程---无坑版
运维 - 实践篇(五)- 基础 K8S 单机环境搭建
https://code.webterren.com/COAL-Terren/k8s-deploy/src/branch/main/local.md
全网最简单的ingress-nginx安装部署Kubernetes 笔记(10)— Ingress、Ingress Controller、IngressClass 的产生缘由、YAML 描述及使用
如何删除Terminating状态的命名空间?
相关文章:

K8S及Rancher部署
前言 这篇文写的有点子啰嗦,甚至为了控制篇幅我还分出了其他好几篇文章,只在本文中保留了我认为必须存在。而之所以篇幅这么长,一方面是我在相关领域完全新手,啥啥都不会;而另一方面是我所参考的资料都过于精简&#…...

Qt Creator使用git管理代码
1.在GitHub中新建仓库,设置好仓库名后,其它的设置默认即可。 2.打开git bash,输入以下命令: git config --global user.name "xxxxx" #设置你的GitHub用户名 git config --global user.email "xxxxxxxxx.…...
pandas教程:pandas读取csv文件并指定字段数据类型
文章目录 pandas指定数据类型处理数据类型错误parse_dates参数pandas数据类型处理示例pandas指定数据类型 在读取csv文件时,我们可以使用dtype参数来指定每个列的数据类型。这个参数接受一个字典类型的值,其中键是列名,值是数据类型。数据类型可以是Pandas类型或NumPy类型,…...

c#中使用数据验证器
前言 在很多情况下,用户的输入不一定满足我们的设计要求,需要验证输入是否正确,传统的方案是拿到控件数据进行逻辑判定验证后,给用户弹窗提示。这种方法有点职责延后的感觉,数据视图层应该很好的处理用户的输入。使用…...

Java真人版猫爪老鼠活动报名平台系统
🐾“真人版猫爪老鼠活动报名平台系统”——趣味追逐,等你来战!🐭 🐱【萌宠变主角,现实版趣味游戏】 厌倦了电子屏幕的虚拟游戏?来试试“真人版猫爪老鼠活动”吧!在这个平台上&…...

Git原理与用法系统总结
目录 Reference前言版本控制系统Git的诞生配置Git配置用户名和邮件配置颜色配置.gitignore文件 Git的基础用法初始化仓库克隆现有的仓库添加暂存文件提交变动到仓库比较变动查看日志Git回退Git重置暂存区 Git版本管理重新提交取消暂存撤销对文件的修改 Git分支Git分支的优势Git…...

连载|浅谈红队中的权限维持(六)-Linux 主机后门与Linux 隐藏文件
本文来源无问社区,更多实战内容,渗透思路可前往查看http://www.wwlib.cn/index.php/artread/artid/11584.html 0x01 Linux 主机后门 1、添加用户 一句话添加用户 useradd test;echo -e "123456n123456n" |passwd test 或者使用 openssl …...

tomato-靶机渗透
tomato-靶机 一、安装靶机环境 下载双击.ova文件,写文件名路径导入 打开虚拟机用NAT模式 编辑–>虚拟网络编辑器查看IP段 二、信息收集 1.御剑端口扫描查找该虚拟机的IP 访问网站 扫目录 dirb http://192.168.30.130 收集到目录 /server-status /antibot_im…...

git的配置使用
第三周 Tursday 早 git日志的安装使用 [rootweb ~]# yum -y install git.x86_64 //安装软件包 [rootweb ~]# rpm -ql git //查看git的包 [rootweb ~]# mkdir /yy000 //创建新目录 [rootweb ~]# cd /yy000/ [rootweb yy000]# git init //将当前目录做为仓库…...
【1.0】drf初识
【1.0】drf初识 【一】前后端开发模式 【1】前后端混合开发 【示例】flask混合、django混合【案例】bbs项目 模板:dtl语法(django template language)模板语法 {{}} /{% %}后端渲染 qs对象–遍历循环到模板中–使用模板语法渲染渲染完成后 得到纯粹的…...
SparkSQL---编程模型的操作,数据加载与落地及自定义函数的使用
一、SparkSQL编程模型的创建与转化 1、DataFrame的构建 people.txt数据: 1 zhangsan 20 2 lisi 29 3 wangwu 25 4 zhaoliu 30 5 tianqi 35 6 kobe 40 people.json数据:在SparkSQL—简介及RDD V.S DataFrame V.S Dataset编程模型详解里 1、从Spark数据…...

文件解析漏洞--IIS--Vulhub
文件解析漏洞 一、IIS解析漏洞 用windowserver2003安装IIS测试 1.1 IIS6.X 方法一:目录解析 在网站下建立文件夹的名字为.asp/.asa的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。 1.txt文件里是asp文件的语法查看当前时间 方…...

你知道缓存的这个问题到底把多少程序员坑惨了吗?
在现代系统中,缓存可以极大地提升性能,减少数据库的压力。 然而,一旦缓存和数据库的数据不一致,就会引发各种诡异的问题。 我们来看看几种常见的解决缓存与数据库不一致的方案,每种方案都有各自的优缺点 先更新缓存&…...

飞创直线模组桁架机械手优势及应用领域
随着工业自动化和智能制造的发展,直线模组桁架机械手极大地减轻了人类的体力劳动负担,在危险性、重复性高的作业环境中展现出了非凡的替代能力,引领着工业生产向自动化、智能化方向迈进。 一、飞创直线模组桁架机械手优势 飞创直线模组桁架…...

TongHttpServer 简介
1. 概述 随着网络技术的飞速发展,高并发大用户场景越来越普遍,单一应用服务节点已经不能满足并发需求,为了提高整个系统可靠性,扩展性,吞吐率,通常将多个应用服务器通过硬负载/软负载组成集群,负载均衡器根据不同负载算法将请求分发到各个应用服务器节点。 Tong…...
回溯法---组合总和
题目: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限…...

将Android Library项目发布到JitPack仓库
将项目代码导入Github 1.将本地项目目录初始化为 Git 仓库。 默认情况下,初始分支称为 main; 如果使用 Git 2.28.0 或更高版本,则可以使用 -b 设置默认分支的名称。 git init -b main 如果使用 Git 2.27.1 或更低版本,则可以使用 git symbo…...

JAVAWeb实战(后端篇)
因为前后端代码内容过多,这篇只写后端的代码,前端的在另一篇写 项目实战一: 1.创建数据库,表等数据 创建数据库 create database schedule_system 创建表,并添加内容 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------…...

【vs】实用调试技巧——学会写优秀的代码!
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、什么是BUG? 三、调试是什么?有多重要? 一名优秀…...
数组声明方式
数组声明方式 一、 一维数组 元素数据类型[] 数组名; // 推荐元素数据类型 数组名[]; 二、 二维数组 元素数据类型[][] 数组名称; // 推荐元素数据类型 数组名称[][];元素数据类型[] 数组名称[]; 注: 对于第三种方式元素数据类型[] 数组名称[];,可…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...