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 init
和kubeadm 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,可以按照以下步骤进行操作:
首先,使用root用户登录到主节点或控制平面节点。
停止kubelet服务:运行命令
systemctl stop kubelet
。删除当前集群的所有网络接口:运行命令
ip link delete cni0
和ip link delete flannel.1
。删除当前集群的所有容器(把相关的删掉就行,别删所有的):运行命令
docker rm -f $(docker ps -qa)
(该命令删除所有容器)。删除当前集群的所有数据:运行命令
rm -rf /var/lib/cni/ /var/lib/kubelet /etc/cni/ /var/run/kubernetes /var/lib/cni/ /var/run/calico/ /etc/kubernetes /var/lib/etcd
。执行kubeadm reset命令以重置kubeadm和相关配置:运行命令
kubeadm reset
。如果您使用了网络插件(如Flannel、Calico等),则需要删除其相关配置。例如,对于Flannel,运行命令
rm -rf /etc/cni/net.d/10-flannel.conflist
。最后,重新初始化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