kubernetes(二)创建集群

kubernetes(一)概述与架构
云原生实战 · 语雀
官网 Kubernetes 文档 | Kubernetes
更新:移除 Dockershim 的常见问题 | Kubernetes
B站课程:https://www.bilibili.com/video/BV13Q4y1C7hS/?p=26

安装版本说明:
视频教程安装Docker指定版本20.10.7(我实际安装24.0.7,并装了cri-dockerd版本v0.3.8)
视频教程安装kubelet、kubeadm、kubectl指定版本1.20.9(我实际安装1.28.2)
视频教程安装网络组件calico版本v3.20(我实际安装kube-flannel版本v0.22.0)
视频教程安装dashboard指定版本v2.3.1(我实际安装v2.7.0)

3.kubernetes创建集群

在这里插入图片描述

弹幕:想省钱的可以看看阿里云的抢占式实例,选性能突发实例t6,2核4G一个小时0.04元,花几块钱够玩好几天

3.1 安装Docker

请参照以前Docker安装。先提前为所有机器安装Docker

本视频教程安装Docker指定版本20.10.7(而我实际安装24.0.7)

yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6

3.2 安装cri-dockerd

若Kubernetes版本在v1.24及以上,想使用Docker,所有机器需额外安装cri-dockerd。

cri-dockerd 是一种基于 Docker 的容器运行时实现,它通过实现 CRI 接口,使 Kubernetes 能够与 Docker 进行交互,创建和管理容器

将 Docker Engine 节点从 dockershim 迁移到 cri-dockerd | Kubernetes

容器运行时 | Kubernetes

按照源代码仓库中的说明安装 cri-dockerd

对于 cri-dockerd,默认情况下,CRI 套接字是 /run/cri-dockerd.sock

下载安装并启动

# 直接点击下载丢到服务器,网络好的话可以直接服务器执行以下命令下载
sudo wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8-3.el7.x86_64.rpm
# 通过rpm安装 -i安装软件包 -v显示详细的安装过程 -h显示进度条
sudo rpm -ivh cri-dockerd-0.3.8-3.el7.x86_64.rpm
# 没有rpm命令,可以执行安装该命令
# yum - y intall rpm# 启动cri-dockerd
# 重载系统守护进程
sudo systemctl daemon-reload 
# 设置cri-dockerd自启动
sudo systemctl enable cri-docker.socket cri-docker 
# 启动cri-dockerd
sudo systemctl start cri-docker.socket cri-docker 
# 查看cri-dockerd状态
sudo systemctl status cri-docker.socket

改下cri-docker.service

否则在kubeadm init时会报错

detected that the sandbox image “registry.k8s.io/pause:3.6” of the container runtime is inconsistent with that used by kubeadm. It is recommended that using “registry.aliyuncs.com/google_containers/pause:3.9” as the CRI sandbox image.
然后导致Initial timeout of 40s passed.

systemctl stop cri-docker
vim /usr/lib/systemd/system/cri-docker.service
# 找到ExecStart,在后面添加 --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9# 重新加载服务
sudo systemctl daemon-reload
# 启动cri-docker服务
sudo systemctl start cri-docker
# 查看cri-docker服务状态
sudo systemctl status cri-docker -l

在这里插入图片描述

3.3 安装kubeadm

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令

  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)

  • 2 CPU 核或更多

  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)

    • 设置防火墙放行规则
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。

    • 设置不同hostname
  • 开启机器上的某些端口。请参见这里 了解更多详细信息。

    • 内网互信
  • 禁用交换分区。为了保证 kubelet 正常工作,必须关闭交换分区(kubelet 自 v1.22 起已开始支持交换分区。自 v1.28 起,仅针对 cgroup v2 支持交换分区; kubelet 的 NodeSwap 特性门控处于 Beta 阶段,但默认被禁用)

    • 输入free -m后,swap所在的行,显示的【total、used、free】都得是0

3.3.1 基础环境

所有机器执行以下操作

# 各个机器设置自己的主机名
hostnamectl set-hostname xxxx
# xxxx 参考:k8s-master、k8s-node1、k8s-node2
# 查看主机名
hostname# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
# 第一句是临时禁用,第二句是改配置文件永久禁用,两个都要执行
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config# 关闭swap
# 第一句是临时禁用,第二句是改配置文件永久禁用,两个都要执行
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab# 允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF# 让以上的配置生效
sudo sysctl --system

关防火墙

systemctl stop firewalld.service
systemctl status firewalld.service
systemctl disable firewalld.service

3.3.2 安装kubelet、kubeadm、kubectl

kubelet是“厂长”,在集群中的每个节点上用来管理、监控节点上的Pod 和容器。

kubectl是与集群通信的命令行工具,

kubeadm是引导我们创建集群的

安装工具 | Kubernetes

Kubernetes 命令行工具 kubectl, 可以对 Kubernetes 集群运行命令。 可以用 kubectl 来部署应用、监测和管理集群资源以及查看日志。

可以使用 kubeadm 工具来创建和管理 Kubernetes 集群。 该工具能够执行必要的动作并用一种用户友好的方式启动一个可用的、安全的集群。

gpgcheck=0表示禁用GPG签名检查。

在 Linux 系统中安装并设置 kubectl | Kubernetes用原生包管理工具安装

  • gpgcheck决定了是否在安装包时进行GPG签名检验。若为1,在安装包时会验证该包是否是被信任的发布者所签名发行的,这是一种防止因安装被篡改或者无意识安装恶意软件包的方式。如果你确定软件源可信或者明确知道软件包没有使用GPG签名,你可以设置gpgcheck=0来禁用GPG签名检查,yum将不会检查软件包的GPG签名直接进行安装,可以加速安装过程,但是降低了安全性。

  • repo_gpgcheck=0:这个配置表示是否检查存储库元数据的 GPG 签名。设置为 0 表示关闭 GPG 签名检查,设置为 1 则表示开启。

  • gpgkey=http://xxx:这个配置指向了 GPG 公钥的 URL 地址。当gpgcheck 或 repo_gpgcheck 打开时,这个公钥将用于检查软件包或存储库元数据的签名。

  • exclude=kubelet kubeadm kubectl:这个配置表示在软件包更新或安装过程中忽略指定的软件包。

三台机器都执行以下命令,添加yum存储库配置文件kubernetes.repo

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

版本偏差策略 | Kubernetes

# 安装kubelet、kubeadm、kubectl
# 视频教程安装的
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
# 我实际安装的1.28.2 (发布日期: 2023-09-13)。截至2023.12.19最新版本1.29.1(发布日期2023-12-13),但镜像源中没有,所以装的1.28.2
sudo yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2 --disableexcludes=kubernetes# 查看版本信息的命令
kubelet --version
kubeadm version
kubectl version --client# 三台机器都启动kubelet
sudo systemctl enable --now kubelet
# enable将kubelet服务设置为开机启动。而通过添加
# --now选项,kubelet服务将立即启动# 补充命令
# 手动启动
# systemctl start kubelet
# sudo journalctl -u kubelet

watch -n1 systemctl status kubelet实时查看kubelet状态(或者systemctl status kubelet命令,这个kubelet状态启动的频率很小,要狂刷才能看到),发现kubelet 每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环,这是正常的,等待发号施令。

在使用kubeadm初始化Kubernetes集群时,需要在Master节点上运行一些kubeadm命令来完成初始化过程。其中一个命令是kubeadm init,它将生成一个用于加入其他节点的令牌。kubelet服务在启动时会检查是否存在这个令牌,如果没有找到,它会陷入一个等待kubeadm指令的死循环。

3.4 使用kubeadm引导集群

除了kubelet,其他的都是以容器的方式运行,因此可以先提前下载好需要的镜像

3.4.1 下载各个机器需要的镜像

使用 kubeadm 创建集群 | Kubernetes

准备所需的容器镜像

这个步骤是可选的,只适用于你希望 kubeadm initkubeadm join 时不从 registry.k8s.io 下载默认容器镜像的情况。

当在离线的节点上创建一个集群的时,Kubeadm 有一些命令可以预拉取所需的镜像。 阅读离线运行 kubeadm 获取更多的详情。

Kubeadm 允许你给所需要的镜像指定一个自定义的镜像仓库。 阅读使用自定义镜像获取更多的详情。

kubeadm config images list可以列出所需的Kubernetes组件的容器镜像,包含每个控制平面组件所需的镜像及其版本。

[root@主机名 ~]# kubeadm config images list
I1220 10:27:55.955150    9367 version.go:256] remote version is much newer: v1.29.0; falling back to: stable-1.28
registry.k8s.io/kube-apiserver:v1.28.4
registry.k8s.io/kube-controller-manager:v1.28.4
registry.k8s.io/kube-scheduler:v1.28.4
registry.k8s.io/kube-proxy:v1.28.4
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1# 我实际执行的命令
# 主节点执行
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.4
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.4
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.4
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.4
docker pull registry.aliyuncs.com/google_containers/pause:3.9
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0
docker pull registry.aliyuncs.com/google_containers/coredns:v1.10.1
# 从节点执行
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.4
# 只有master机器需要这么多镜像。视频教程所用的版本1.20.9。以下命令产生了文件images.sh。
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF# 赋予执行权限 并且执行该脚本
chmod +x ./images.sh && ./images.sh# 两台node机器只下载kube-proxy就可以
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/kube-proxy:v1.20.9

3.4.2 初始化主节点

弹幕:如果是arm架构的linux系统,用老师的dockerhub上的镜像init的时候会报超时错误,因为docker容器启不起来,要找对应的linux/arm架构的镜像

# 所有机器添加master域名映射(所有机器都粘贴执行),以下需要修改为自己的master机器的ip
# master节点也叫做集群的入口节点(cluster-endpoint,可以自己起名)
# 这是在/etc/hosts添加域名映射,访问cluster-endpoint域名则去到172.31.0.4
# 待验证:弹幕说这个地方不要用公网ip,会报错
echo "172.31.0.4  cluster-endpoint" >> /etc/hosts
# 以下两句可以不用配置
# echo "master的ip  master" >> /etc/hosts
# echo "node1的ip  node01" >> /etc/hosts
# 测试,在所有机器上(包括master)能ping通
ping cluster-endpoint# 主节点初始化。只在主节点运行。修改以下
# apiserver-advertise-address是master节点ip
# control-plane-endpoint上方配置的域名的值
# image-repository镜像仓库。不配置的话,文档说默认使用registry.k8s.io,看你能不能ping通吧
# kubernetes-version是k8s版本,与安装时的版本号保持一致
# service-cidr是service的网络范围,k8s集群内部对大量服务进行负载均衡时用的,尽量不要改
# pod-network-cidr是pod的网络范围,也最好不要改
kubeadm init \
--apiserver-advertise-address=172.31.0.4 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16
# 我实际执行的
kubeadm init \
--apiserver-advertise-address=172.31.254.210 \
--node-name=cluster-endpoint \
--control-plane-endpoint=cluster-endpoint \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.2 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock
# 教程里的--pod-network-cidr是calico的默认配置,如果使用flannel应该写--pod-network-cidr=10.244.0.0/16# 如果要改service-cidr和pod-network-cidr,要保证【所有网络范围不重叠】,同时也不能跟机器的ip范围重叠
# 比如,若service-cidr配的是172.31.0.0/16,就跟机器重叠了。
# 执行命令【ip a】可以看到Docker把172.17占用了,服务器若再选172.17可能有问题,因此教程购买服务器时选的是172.31、根据提示继续
# 弹幕:主机IP是192.168的可以把pod-network-cidr设置为10.244.0.0/16

如果初始化报错失败

要重新初始化kubeadm,可以按照以下步骤进行操作:

  1. 首先,使用root用户登录到主节点或控制平面节点。

  2. 停止kubelet服务:运行命令systemctl stop kubelet

  3. 删除当前集群的所有网络接口:运行命令ip link delete cni0ip link delete flannel.1

  4. 删除当前集群的所有容器(把相关的删掉就行,别删所有的):运行命令docker rm -f $(docker ps -qa)(该命令删除所有容器)。

  5. 删除当前集群的所有数据:运行命令rm -rf /var/lib/cni/ /var/lib/kubelet /etc/cni/ /var/run/kubernetes /var/lib/cni/ /var/run/calico/ /etc/kubernetes /var/lib/etcd

  6. 执行kubeadm reset命令以重置kubeadm和相关配置:运行命令kubeadm reset

  7. 如果您使用了网络插件(如Flannel、Calico等),则需要删除其相关配置。例如,对于Flannel,运行命令rm -rf /etc/cni/net.d/10-flannel.conflist

  8. 最后,重新初始化kubeadm。您可以按照之前的步骤重新运行kubeadm init命令来初始化新的集群。

请注意,重新初始化kubeadm将清除当前集群中的所有数据和配置,包括节点和Pod信息。确保在执行此操作之前备份重要数据,并谨慎操作。

再不行可以reboot重启机器试下

master成功后提示如下,复制一下提前保留,根据它的提示做。

弹幕:出现 It seems like the kubelet isn’t running or healthy. 说明docker服务未配置cgroupfs 可以参考 dockers 部署安装那一篇文章

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.conf# 部署一个pod网络插件。可以从下面的链接看文档,教程选用calico
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/# 可以按照以下命令加入任意多的【主节点】
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 cluster-endpoint:6443 --token hums8f.vyx71prsg74ofce7 \--discovery-token-ca-cert-hash sha256:a394d059dd51d68bb007a532a037d0a477131480ae95f75840c461e85e2c6ae3 \--control-plane # 可以按照以下命令加入任意多的【工作节点】
Then you can join any number of worker nodes by running the following on each as root:kubeadm join cluster-endpoint:6443 --token hums8f.vyx71prsg74ofce7 \--discovery-token-ca-cert-hash sha256:a394d059dd51d68bb007a532a037d0a477131480ae95f75840c461e85e2c6ae3

我自己实际显示的

[init] Using Kubernetes version: v1.28.2
[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 in 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 [cluster-endpoint kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 172.31.254.210]
[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 [cluster-endpoint localhost] and IPs [172.31.254.210 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [cluster-endpoint localhost] and IPs [172.31.254.210 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 "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". This can take up to 4m0s
[apiclient] All control plane components are healthy after 8.003598 seconds
[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 cluster-endpoint 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 cluster-endpoint as control-plane by adding the taints [node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: 72iez2.4m121dqbx5no00vk
[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 Kube
rnetes 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.conf# 部署一个pod网络插件。可以从下面的链接看文档,教程选用calico,个人实际操作选择flannel
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/# 可以按照以下命令加入任意多的【主节点】
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 cluster-endpoint:6443 --token 72iez2.4m121dqbx5no00vk \--discovery-token-ca-cert-hash sha256:71ae2cb27b517e0531ed358f3545989b45583bb3f62b6c3dabe6fe1be5e4b529 \--control-plane # 可以按照以下命令加入任意多的【工作节点】
Then you can join any number of worker nodes by running the following on each as root:kubeadm join cluster-endpoint:6443 --token 72iez2.4m121dqbx5no00vk \--discovery-token-ca-cert-hash sha256:71ae2cb27b517e0531ed358f3545989b45583bb3f62b6c3dabe6fe1be5e4b529

其他命令

# 查看集群所有节点
# 没做【部署一个pod网络插件】时执行此命令可看到master的status是【NotReady】
kubectl get nodes# 根据配置文件,给集群创建资源
kubectl apply -f xxxx.yaml# 查看集群部署了哪些应用?
docker ps   ===   kubectl get pods -A
# 运行中的应用,在docker里面叫容器,在k8s里面叫Pod
kubectl get pods -A# 查看kubelet日志
sudo journalctl -u kubelet    # 这个命令日志不自动换行
sudo journalctl -u kubelet --no-pager --follow

3.4.3 根据提示继续

设置 $HOME/.kube/config

复制上面命令

安装网络组件

calico官网

https://github.com/projectcalico/calico/releases/tag/v3.17.0

另外弹幕建议不用calico而用flannel:kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

curl https://github.com/flannel-io/flannel/releases/download/v0.22.0/kube-flannel.yml -O

注意配置文件中的网段应该与init时配置的–pod-network-cidr一致

# 在master节点上执行,把calico的配置文件下载下来,再传给其他机器。
# 检查下当前的k8s和calico对应的版本下正确的版本后再运行,此处若报错只需要换一个版本就行了。
# no matches for kind "PodDisruptionBudget" in version "policy/v1"这个报错是因为网络插件与k8s版本不匹配,换一个就可以了
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
# 确认有calico.yaml
ls# 只要有配置文件,执行以下命令会自动创建很多东西,这一步就把网络插件部署好了
# 直接执行该命令的前提是【初始化主节点】时没有修改cidr,否则需要修改calico.yaml的相应的配置
kubectl apply -f calico.yaml
# 弹幕:这个可以回滚刚才的操作
# kubectl delete -f calico.yaml
# 我实际执行的
kubectl apply -f kube-flannel.ymlkubectl get pods -A

在这里插入图片描述

在这里插入图片描述

3.4.4 加入node节点

弹幕:后面子节点join不上的话,把防火墙关一下,老师之前那个关防火墙的命令不管用,可以用firewall-cmd --state查看是不是真的关了

systemctl disable firewalld --now
systemctl stop firewalld
systemctl disable firewalld    # 设置开机不启动防火墙
sudo firewall-cmd --add-port=6443/tcp --permanent sudo firewall-cmd --reload
service firewalld stop
systemctl status firewalld.service    # 查看防火墙状态

云服务器的安全组要开放6443端口

# 复制前面master成功后保留的命令,该命令24小时有效
kubeadm join cluster-endpoint:6443 --token x5g4uy.wpjjdbgra92s25pp \--discovery-token-ca-cert-hash sha256:6255797916eaee52bf9dda9429db616fcd828436708345a308f4b917d3457a22
# 若24小时后该令牌失效了,可以在master上再重新生成加入集群的密码
# sudo kubeadm token create --print-join-command
# 弹幕:加入节点卡主不动,可以在master节点上用kubeadm token create --print-join-command重新申请一个token,就可以了# 我实际执行
kubeadm join cluster-endpoint:6443 --token 72iez2.4m121dqbx5no00vk \--discovery-token-ca-cert-hash sha256:71ae2cb27b517e0531ed358f3545989b45583bb3f62b6c3dabe6fe1be5e4b529 \
--cri-socket=unix:///var/run/cri-dockerd.sock

如果加入失败,想重新加入

sudo systemctl stop kubelet

sudo kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock

sudo systemctl enable --now kubelet

watch -n1 systemctl status kubelet

在这里插入图片描述

看到“This node has joined the cluster”就代表该工作节点已经加入该集群

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
# 可以使用kubectl get nodes这个命令在控制平面(主节点)看,必须在主节点看,node节点会报错。
Run 'kubectl get nodes' on the control-plane to see this node join the cluster

等一会儿,监控进度状态

# -w参数,有变化会追加显示
kubectl get pods -A -w
# 或者用Linux命令每1秒查看状态
watch -n 1 kubectl get pods -A

在这里插入图片描述

在这里插入图片描述

等到ready全部都是1/1,status全部都是running之后,查看nodes状态也都会是Ready

kubectl get nodes

机器重启后k8s集群会自动恢复的,如果有问题试试restart,以及关防火墙、检查网络

systemctl restart docker.service
systemctl restart kubelet.service

生成新令牌

kubeadm token create --print-join-command

高可用部署方式,也是在这一步的时候,使用添加主节点的命令即可

3.4.5 验证集群

验证集群节点状态kubectl get nodes

4.部署dashboard

4.1 部署

kubernetes官方提供的可视化界面

https://github.com/kubernetes/dashboard

https://github.com/kubernetes/dashboard/releases

# 该命令需要先下载远程的yaml文件,可能比较慢,可以先用wget命令下载
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
# 我实际执行的:安装v3.0.0-alpha0有问题没解决,【kubectl delete -f 该url】卸载了之后,又重新安装的v2.7.0版本
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.0-alpha0/charts/kubernetes-dashboard.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

4.2 设置访问端口

# 把【type: ClusterIP】改为【type: NodePort】,这步操作相当于暴露web界面的端口
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
# 找到端口,在云服务器的安全组放行。显示的随机生成的三万多的端口(比如30753)就是访问k8s控制台的
kubectl get svc -A |grep kubernetes-dashboard
# 获取集群中所有命名空间下的Pod的信息。-A参数将在所有命名空间中获取Pod的信息,而不仅仅在当前命名空间。
kubectl get pods -A

访问【https://集群任意IP:端口】https://139.198.165.238:32759

弹幕讨论:

如果出现进入不了dashboard界面,报错显示connection time out的话,可能是兼容性问题导致的,换另一个版本的calico或者flannel即可

谷歌浏览器如果没有“继续前往”选项的话,键盘直接敲thisisunsafe

用node的IP可以访问dashboard,用master的IP却无法访问时,可以在master上执行iptables -P FORWARD ACCEPT

4.3 创建访问账号

1.24版本的k8s用kubectl -n kubernetes-dashboard create token admin-user

视频中1.20.9版本,创建访问账号,准备一个yaml文件vim dash.yaml

apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin-user
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: admin-usernamespace: kubernetes-dashboard

应用配置

kubectl apply -f dash.yaml
# 会显示admin-user已创建
# serviceaccount/admin-user created
# clusterrolebinding.rbac.authorization.k8s.io/admin-user created

4.4 令牌访问

输入以下命令,把输出的结果(令牌)复制备份,粘贴到登录界面的token处。

# 教程k8s是v1.20.9 获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

我实际安装v1.28.2,获取访问令牌方式

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
# 上面的命令没有生成token,参考解决:https://zhuanlan.zhihu.com/p/655525723
# 1)创建serviceaccount
kubectl create serviceaccount myadmin -n kubernetes-dashboard
# 2)查看账户信息
kubectl get serviceaccount myadmin -o yaml  -n kubernetes-dashboard
# 3)绑定角色
kubectl create clusterrolebinding myadmin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:myadmin   -n kubernetes-dashboard
# 4)生成token
kubectl create token myadmin  -n kubernetes-dashboard

生成了token类似以下:

eyJhbGciOiJSUzI1NiIsImtpZCI6InNOSUU0SGtoeTJQNVYwcHFGeUUxN3pMaV9VdjJnU1hfZi1oYmRlWWJWS3MifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzA0MzU0NzI4LCJpYXQiOjE3MDQzNTExMjgsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJteWFkbWluIiwidWlkIjoiYzczNTE4MzMtNjk1Yy00ZjIzLTg1MjAtYWUyNjNmMWZkOWZiIn19LCJuYmYiOjE3MDQzNTExMjgsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDpteWFkbWluIn0.A0Gpahsxvc9jWH4o6b1ZJNB90ez9hN86Up23UeSMtKm_tFK0d9hgWjvVijOkTRnLW1Tg8K3sTBS8HtNPwdyKzwDIt0XPKgmecq2csU2Ca_tngbuR04DCnGUbQgvDe_HXaQlREvnV_pWdcey85exsYmClcXst5FDfHpfNYtKbbeYSTmu-jJKwphrHeuJXzjFrCGEaM5RKmcupyXFVOYE6QEcstYvzukBMxd76AVAgKMEVAz1–A70TykvqhVU2thgdudslCA2HJsyNNGkrsHQW7t5Nj6YFvXgwE6TPmjTROek4VXINPkPCjUaLUg_WSjzjzk-poVmkBffCTdNSYpPeg

在这里插入图片描述

4.5 界面

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【nginx】linux(centos版本)安装nginx

目录 一、下载安装包1.1 官网下载1.2 linux命令下载 二、安装2.1 安装依赖包2.2 安装nginx 三、启动四、访问五、关停六、重载配置 一、下载安装包 1.1 官网下载 1.官网地址 https://nginx.org/en/download.html2.版本说明 1.Mainline version-主线版本 2.Stable version-稳…

LeetCode 2487. 从链表中移除节点:单调栈

【LetMeFly】2487.从链表中移除节点&#xff1a;单调栈 力扣题目链接&#xff1a;https://leetcode.cn/problems/remove-nodes-from-linked-list/ 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输…

聊一聊 .NET高级调试 内核模式堆泄露

一&#xff1a;背景 1. 讲故事 前几天有位朋友找到我&#xff0c;说他的机器内存在不断的上涨&#xff0c;但在任务管理器中查不出是哪个进程吃的内存&#xff0c;特别奇怪&#xff0c;截图如下&#xff1a; 在我的分析旅程中都是用户态模式的内存泄漏&#xff0c;像上图中的…

openlayer 轨迹动画(方式一)使用ol-ext

ol-ext官方示例地址&#xff1a;ol-ext 示例代码 实测可用 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>点沿线动画</title><!-- Openlayers -->…

使用pnnx将Torch模型转换为ncnn

1. 引言 以往我们将Torch模型转换为ncnn模型&#xff0c;通常需经过Torch–>onnx&#xff0c;onnx–>ncnn两个过程。但经常会出现某些算子不支持的问题。 ncnn作者针对该问题&#xff0c;直接开发一个Torch直接转换ncnn模型的工具 (PNNX)&#xff0c;以下为相关介绍及使…

Linux端口转发的几种常用方法

1. SSH 端口转发 SSH 提供了一个非常有意思的功能&#xff0c;就是端口转发&#xff0c;它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发&#xff0c;并且自动提供了相应的加密及解密服务。 (1) 本地端口转发 ssh -fgN -L 2222:localhost:22 localhost (2) 远程端口转…

java查询结果的处理

java查询结果的处理 为了方便使用sql的数据&#xff0c;在查询后mysql会把数据封装到java里面的resultset对象&#xff0c;然后我们需要把resultset里的数据再封装到我们自己创建的对象中&#xff0c;比如Student对象&#xff1a; public class Student {int number;String n…

超快速排序

title: 超快速排序 date: 2024-01-05 11:51:43 tags: 逆序对 categories: 算法进阶指南 题目大意 解题思路 逆序数是一个序列每一个数的左边有多少比他本身大的值。将一个序列排序完整&#xff0c;最小交换次数即是逆序数之和。使用归并排序的同时&#xff0c;将每一个逆序数求…

C#用StringBuilder高效处理字符串

目录 一、背景 二、使用StringBuilder便捷、高效地操作字符串 三、实例 1.源码 2.生成效果 四、实例中知识点 1.StringBuilder类 &#xff08;1&#xff09;构造函数 &#xff08;2&#xff09;属性 &#xff08;3&#xff09;方法 2.Environment.NewLine 属性 一、…

SurfaceView和TextureView理解相关

一、为什么要使用SurfaceView 我们知道View是通过刷新来重绘视图&#xff0c;系统通过发出VSSYNC信号来进行屏幕的重绘&#xff0c;刷新的时间间隔是16ms,如果我们可以在16ms以内将绘制工作完成&#xff0c;则没有任何问题&#xff0c;如果我们绘制过程逻辑很复杂&#xff0c;…

SSD 颗粒还要涨价50%,入手前小心速度陷阱

大伙应该感受到了&#xff0c;自今年年中开始 SSD 普遍开始了小幅涨价。 但即便涨价到现在&#xff0c;NAND 厂商仍属于倒亏状态... 原因很简单&#xff0c;库存太多。 根据 TrendForce 的报道&#xff0c;主要制造商价格将需要再次上涨 40% 以上才能不亏&#xff0c;而达到盈…

【ZYNQ入门】第五篇、AXI HP口读写数据原理

目录 第一部分、AXI总线的相关知识 1、ZYNQ架构 2、AXI 总线和 AXI 接口以及 AXI 协议 3、AXI 总线与 ZYNQ 的关系 4、AXI 总线介绍 5、AXI 接口介绍 6、AXI 协议介绍 7、AXI高效传输的原因 8、常见总线汇总 9、HP接口写时序配置 10、HP DDR的地址分配 11、缓存一…

QT开源类库集合

QT开源类库集合 一、自定义控件 QSintQicsTableLongscroll-qtAdvanced Docking System 二、图表控件 QwtQCustomPlotJKQTPlotter 三、网络 QHttpEngineHTTP 四、 音视频 vlc-qt 五、多线程 tasks 六、数据库 EasyQtSql 一、自定义控件 1. QSint 源代码地址&#xff1a;QSint&…

如何缓解BOT攻击?分享灵活准确的防御之道

BOT流量在所有互联网流量中的占比过半&#xff0c;而且存在好坏之分。其中“好”的BOT&#xff0c;比如在互联网上搜索和查找内容的BOT&#xff0c;它们是我们不可或缺的帮手。恶意的BOT进行信息数据爬取、薅羊毛等攻击行为&#xff0c;正损害着企业和用户的利益。专业数据统计…

将文本文件导入Oracle数据库的简便方法:SQL Developer

需求 我有一个文本文件dbim.txt&#xff0c;是通过alert log生成的&#xff0c;内容如下&#xff1a; 2020-09-11 2020-09-11 ... 2023-12-03 2023-12-03 2023-12-26我已经在Oracle数据库中建立了目标表&#xff1a; create table dbim(a varchar(16));我想把日志文件导入Or…

Java IO 流面试题

1. Java 中有几种类型的流&#xff1f;JDK 为每种类型的流提供了哪些抽象类以供继承&#xff1f; 参考答案 基础流可以分为&#xff1a;字节流&#xff0c;字符流。字节流继承于 InputStream、OutputStream 抽象类&#xff0c;字符流继承于 Reader 和 Writer 抽象类。在 java.…

若依管理系统部署

本文章仅供参考&#xff0c;由于个软件版本不同可能会有偏差。 登录系统打开cmd 编辑文件 这些文件分别打开&#xff0c;打开后在浏览器会出现若依管理系统后台&#xff0c;输入账号 admin 密码 123456即可进入后台。 本文章仅供参考&#xff0c;由于个软件版本不同可能会有…

Linux内存管理:(六)页交换算法

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 引言 在Linux操作系统中&#x…

synchronized锁的底层原理

synchronized 锁是 Java 中用于实现线程同步的关键字。它提供了一种简单而有效的方式来确保多个线程之间的互斥访问。底层原理可以通过 Java 的内存模型和对象监视器锁&#xff08;Monitor Lock&#xff09;来理解。 Monitor结构如下&#xff1a; 在 Java 的内存模型中&#x…

Spring Boot 与 Spring 框架的区别

一、前言 Spring Boot 和 Spring 框架是由 Spring 项目提供的两个关键的技术栈&#xff0c;它们在 Java 开发中扮演着不同的角色。在阐述其区别之前&#xff0c;我们先大致了解下这两个框架 二、Spring 框架 1、背景 Spring 框架是一个全栈的企业应用开发框架&#xff0c;起…