k8s kubeadm部署安装详解
目录
kubeadm部署流程简述
环境准备
步骤简述
关闭 防火墙规则、selinux、swap交换
修改主机名
配置节点之间的主机名解析
调整内核参数
所有节点安装docker
安装依赖组件
配置Docker
所有节点安装kubeadm,kubelet和kubectl
定义kubernetes源并指定版本
部署K8S集群
配置并加载镜像
初始化kubeadm并生成相应的证书
方法一
方法二
设置kubectl的配置文件
所有节点部署网络插件flannel
方法一
方法二
node 节点上执行 kubeadm join 命令加入群集
在master节点查看节点状态
测试pod资源
创建pod并检查
暴露端口提供服务
测试访问
扩展副本
扩展副本的作用
部署 Dashboard
在Master01节点上进行以下操作
创建service account并绑定默认cluster-admin管理员集群角色
使用输出的token登录Dashboard
kubeadm是Kubernetes官方社区推出的一个工具,用于快速部署Kubernetes集群。它可以通过简单的命令完成整个集群的部署过程。kubeadm的主要功能包括初始化集群、添加节点、升级集群版本等。使用kubeadm可以方便地搭建一个符合Kubernetes最佳实践的集群环境,减少了手动配置的复杂性和错误的可能性。通过kubeadm,可以快速开始使用Kubernetes,并且可以根据需要进行扩展和定制。
kubeadm部署流程简述
-
准备环境:
-
安装Docker或其他容器运行时。
-
安装kubeadm、kubelet和kubectl工具。
-
初始化Master节点:
-
初始化完成后,会生成一个加入集群的命令,类似于:
$ sudo kubeadm join <Master节点IP>:<Master节点端口> --token <Token值> --discovery-token-ca-cert-hash <证书哈希值>
-
将该命令保存下来,后续将用于加入Node节点。
-
在Master节点上配置kubectl:
-
安装网络插件:
-
选择一个网络插件(如Calico、Flannel等),并按照其官方文档进行安装。
-
加入Node节点:
-
在每个要加入集群的Node节点上,运行之前保存的加入集群的命令。
-
验证集群状态:
-
在Master节点上,运行以下命令验证集群状态:
$ kubectl get nodes
- 如果所有节点都显示为"Ready"状态,则表示集群部署成功。
环境准备
Master节点:
-
IP地址:192.168.41.31
-
配置要求:2核心CPU以上
-
安装组件:docker、kubeadm、kubelet、kubectl、flannel
Node01节点:
-
IP地址:192.168.41.33
-
配置要求:2核心CPU、2GB内存以上
-
安装组件:docker、kubeadm、kubelet、kubectl、flannel
Node02节点:
-
IP地址:192.168.41.34
-
配置要求:2核心CPU、2GB内存以上
-
安装组件:docker、kubeadm、kubelet、kubectl、flannel
这些节点将组成Kubernetes集群,其中Master节点将负责管理整个集群,而Node节点将承载应用程序和服务的运行。
主节点上安装了Kubernetes的控制平面组件,而工作节点上安装了Kubernetes的工作负载组件。此外,还安装了Docker作为容器运行时,并使用Flannel作为网络插件。
步骤简述
-
在所有节点上安装 Docker 和 kubeadm:首先,在每个节点上安装 Docker 和 kubeadm。这些工具将用于容器化和管理 Kubernetes 集群。
-
部署 Kubernetes Master:选择一个节点作为 Kubernetes Master,并在该节点上初始化 Kubernetes 控制平面。使用 kubeadm 工具来完成此步骤。初始化后,将获得一个用于访问 Kubernetes API 的令牌。
-
部署容器网络插件:为了实现容器之间的网络通信,需要部署一个容器网络插件。常见的选择包括 Calico、Flannel 和 Weave 等。选择适合的环境的插件,并按照其文档进行部署。
-
部署 Kubernetes Node:在每个节点上安装 Docker 和 kubeadm,然后使用 kubeadm 工具将节点加入 Kubernetes 集群。这将使节点成为集群的一部分,并能够运行容器。
-
部署 Dashboard Web 页面:Kubernetes Dashboard 是一个可视化的 Web 界面,用于查看和管理 Kubernetes 资源。可以使用 kubectl 命令行工具或 YAML 文件部署 Dashboard。部署完成后,可以通过浏览器访问 Dashboard,并以图形化方式查看集群中的资源。
关闭 防火墙规则、selinux、swap交换
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
-
systemctl stop firewalld
: 停止firewalld服务。Firewalld是Linux系统中的防火墙管理工具。 -
systemctl disable firewalld
: 禁用firewalld服务,使其在系统启动时不会自动启动。 -
setenforce 0
: 将SELinux的执行模式设置为"Permissive",即宽容模式。SELinux是一种安全增强功能,用于限制进程的访问权限。 -
sed -i 's/enforcing/disabled/' /etc/selinux/config
: 使用sed命令编辑/etc/selinux/config文件,将其中的"enforcing"替换为"disabled",从而永久禁用SELinux。 -
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
: 清空iptables防火墙规则和链,以及删除自定义的用户链。iptables是Linux系统中的防火墙工具。 -
swapoff -a
: 关闭所有的交换分区。交换分区是用于虚拟内存的一种技术,这里关闭交换分区是为了释放系统资源进行其他操作。 -
sed -ri 's/.*swap.*/#&/' /etc/fstab
: 使用sed命令编辑/etc/fstab文件,将其中包含"swap"关键字的行注释掉,从而永久禁用swap分区。swap分区是用于虚拟内存的一种技术,但在Kubernetes集群中,swap分区可能会导致性能问题。关闭和禁用swap分区可以确保Kubernetes的性能和稳定性。 -
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
: 这是一个循环命令,用于加载ipvs模块。它遍历指定路径下的文件,并使用modprobe命令加载这些文件对应的内核模块。ipvs是Linux内核中的一个模块,用于实现负载均衡。在Kubernetes中,负载均衡是非常重要的,因此加载ip_vs模块可以提供负载均衡的支持。
修改主机名
hostnamectl set-hostname master01 #master节点
hostnamectl set-hostname node01 #node节点
hostnamectl set-hostname node02
配置节点之间的主机名解析
vim /etc/hosts192.168.41.31 master01
192.168.41.33 node01
192.168.41.34 node02
使得每个节点都能够通过主机名来识别其他节点。这对于Kubernetes集群的正常运行非常重要,因为各个节点需要相互通信和协作。确保在所有节点上进行相同的hosts文件修改,并使用正确的IP地址和主机名。
调整内核参数
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF#生效参数
sysctl --system
-
cat > /etc/sysctl.d/kubernetes.conf << EOF
: 这个命令用于创建一个名为"kubernetes.conf"的文件,并将后续的内容写入该文件。<< EOF
表示将输入重定向到文件,直到遇到 "EOF" 为止。 -
net.bridge.bridge-nf-call-ip6tables=1
:这是一个内核参数,用于开启网桥模式,将网桥的流量传递给iptables链,以便进行网络转发和过滤。 -
net.bridge.bridge-nf-call-iptables=1
:这也是一个内核参数,用于开启网桥模式,将网桥的流量传递给iptables链,以便进行网络转发和过滤。 -
net.ipv6.conf.all.disable_ipv6=1
:这是一个内核参数,用于禁用IPv6协议。在某些情况下,禁用IPv6可以避免一些网络相关的问题。 -
net.ipv4.ip_forward=1
:这是一个内核参数,用于启用IPv4的IP转发功能。在Kubernetes集群中,节点之间需要进行网络转发,因此需要启用此功能。 -
EOF
:表示输入结束,结束文件的写入。 -
sysctl --system
:这个命令用于重新加载并生效修改后的内核参数。--system
参数表示从配置文件中加载参数。
通过这些操作,可以调整内核参数以满足Kubernetes集群的要求。
所有节点安装docker
安装依赖组件
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
-
yum install -y yum-utils device-mapper-persistent-data lvm2
: 这个命令用于安装一些依赖包,包括yum-utils、device-mapper-persistent-data和lvm2。这些包是Docker安装所需的一些工具和驱动程序。 -
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
: 这个命令用于添加Docker的软件源。在这里,使用阿里云的镜像源作为Docker的软件源,以便从阿里云下载Docker软件包。 -
yum install -y docker-ce docker-ce-cli containerd.io
: 这个命令用于安装Docker的核心组件,包括docker-ce、docker-ce-cli和containerd.io。这些组件是构成Docker引擎的关键部分。
通过执行这些命令,可以在CentOS系统上安装Docker,并准备好运行Docker容器。
配置Docker
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"}
}
EOF
-
mkdir /etc/docker
:这个命令用于创建一个名为"/etc/docker"的目录,用于存放Docker的配置文件。 -
cat > /etc/docker/daemon.json <<EOF
:这个命令用于创建一个名为"daemon.json"的文件,并将后续的内容写入该文件。<<EOF
表示将输入重定向到文件,直到遇到 "EOF" 为止。 -
{"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": {"max-size": "100m"}}
:这是一个JSON格式的配置内容,包含了一些Docker的配置项。 -
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"]
:这个配置项用于设置Docker的镜像加速器,指定了一个阿里云的镜像加速器地址。 -
"exec-opts": ["native.cgroupdriver=systemd"]
:这个配置项用于设置Docker的cgroup驱动程序,将其设置为systemd。 -
"log-driver": "json-file"
:这个配置项用于设置Docker的日志驱动程序,将其设置为json-file,以便以JSON格式记录日志。 -
"log-opts": {"max-size": "100m"}
:这个配置项用于设置Docker日志的选项,指定了最大日志文件大小为100MB。 -
EOF
:表示输入结束,结束文件的写入。
通过这些操作,可以配置Docker的一些参数,如镜像加速器、cgroup驱动程序和日志选项。
使用Systemd管理Cgroup来进行资源控制和管理,并配置Docker的日志存储格式和位置
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service docker info | grep "Cgroup Driver"Cgroup Driver: systemd
-
systemctl daemon-reload
:这个命令用于重新加载Systemd的配置文件,以使新的配置生效。 -
systemctl restart docker.service
:这个命令用于重启Docker服务,以应用新的配置。 -
systemctl enable docker.service
:这个命令用于设置Docker服务在系统启动时自动启动。 -
docker info | grep "Cgroup Driver"
:这个命令用于查看Docker的Cgroup驱动程序的配置。docker info
用于获取Docker的信息,grep "Cgroup Driver"
用于过滤出包含"Cgroup Driver"的行。 -
Cgroup Driver: systemd
:这是一个输出结果,表示Docker当前正在使用Systemd作为Cgroup驱动程序。
通过这些操作,使用Systemd作为Cgroup驱动程序来管理Docker的资源,并将日志存储为json-file格式,大小为100MB,保存在/var/log/containers目录下,以便于其他日志系统(如ELK)收集和管理日志。
所有节点安装kubeadm,kubelet和kubectl
定义kubernetes源并指定版本
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOFyum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11
-
cat > /etc/yum.repos.d/kubernetes.repo << EOF
:这个命令用于创建一个名为"kubernetes.repo"的文件,并将后续的内容写入该文件。<< EOF
表示将输入重定向到文件,直到遇到 "EOF" 为止。 -
[kubernetes]
:这是一个软件源的配置段,用于定义Kubernetes的软件源。 -
name=Kubernetes
:这个配置项用于设置软件源的名称为"Kubernetes"。 -
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
:这个配置项用于设置软件源的基本URL,指定了阿里云的Kubernetes软件源地址。 -
enabled=1
:这个配置项用于启用软件源。 -
gpgcheck=0
:这个配置项用于禁用GPG检查,以便在安装时不进行软件包的验证。 -
repo_gpgcheck=0
:这个配置项用于禁用软件源的GPG检查。 -
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
:这个配置项用于指定GPG密钥的URL,用于验证软件包的完整性。 -
EOF
:表示输入结束,结束文件的写入。 -
yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11
:这个命令用于使用yum包管理器安装指定版本的kubelet、kubeadm和kubectl。-y
参数表示自动回答"yes",以便在安装过程中不需要手动确认。
通过这些操作,定义了Kubernetes的软件源,并安装了指定版本的kubelet、kubeadm和kubectl。
#开机自启kubelet
systemctl enable kubelet.service
#K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启
部署K8S集群
配置并加载镜像
执行命令 kubeadm config images list
可以查看部署Kubernetes集群所需的初始化镜像列表。
这个命令会列出需要的各个组件的镜像名称及其版本。
[root@master01 ~]# kubeadm config images list
I0131 15:26:33.625324 14300 version.go:254] remote version is much newer: v1.29.1; fallig back to: stable-1.20
k8s.gcr.io/kube-apiserver:v1.20.15
k8s.gcr.io/kube-controller-manager:v1.20.15
k8s.gcr.io/kube-scheduler:v1.20.15
k8s.gcr.io/kube-proxy:v1.20.15
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0
在 master 节点上传 v1.20.11.zip 压缩包至 /opt
在Master节点上将v1.20.11.zip的压缩包上传到/opt目录,并解压到/opt/k8s/v1.20.11目录中。然后,使用docker命令加载该目录下的所有.tar镜像文件。
cd/opt/
unzip v1.20.11.zip -d /opt/k8s
cd /opt/k8s/v1.20.11
for i in $(ls *.tar); do docker load -i $i; done
-
cd /opt/
:进入/opt目录。 -
unzip v1.20.11.zip -d /opt/k8s
:将v1.20.11.zip压缩包解压到/opt/k8s/v1.20.11目录中。 -
cd /opt/k8s/v1.20.11
:进入/opt/k8s/v1.20.11目录。 -
for i in $(ls *.tar); do docker load -i $i; done
:遍历当前目录下的所有.tar文件,并使用docker命令加载这些镜像文件。
复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件
在Master节点上,使用scp
命令将/opt/k8s目录及其内容递归地复制到node01和node02节点的/opt目录下。然后,在每个节点上,进入/opt/k8s/v1.20.11目录,并使用docker命令加载该目录下的所有.tar镜像文件。
#在master节点上
scp -r /opt/k8s root@node01:/opt
scp -r /opt/k8s root@node02:/opt
#在node节点上
cd /opt/k8s/v1.20.11
for i in $(ls *.tar); do docker load -i $i; done
-
scp -r /opt/k8s root@node01:/opt
:将Master节点上的/opt/k8s目录及其内容递归地复制到node01节点的/opt目录下。需要提供node01节点的用户名和密码。 -
scp -r /opt/k8s root@node02:/opt
:将Master节点上的/opt/k8s目录及其内容递归地复制到node02节点的/opt目录下。需要提供node02节点的用户名和密码。 -
在node01节点上执行以下命令:
-
cd /opt/k8s/v1.20.11
:进入/opt/k8s/v1.20.11目录。 -
for i in $(ls *.tar); do docker load -i $i; done
:遍历当前目录下的所有.tar文件,并使用docker命令加载这些镜像文件。 -
在node02节点上执行以下命令:
-
cd /opt/k8s/v1.20.11
:进入/opt/k8s/v1.20.11目录。 -
for i in $(ls *.tar); do docker load -i $i; done
:遍历当前目录下的所有.tar文件,并使用docker命令加载这些镜像文件。
请确保在执行这些操作之前,已将/opt/k8s目录及其内容复制到Master节点,并确保已在node01和node02节点上安装并配置好Docker。
初始化kubeadm并生成相应的证书
这里提供两种方法
方法一
kubeadm config print init-defaults > /opt/kubeadm-config.yamlcd /opt/
vim kubeadm-config.yaml
......
11 localAPIEndpoint:
12 advertiseAddress: 192.168.41.31 #指定master节点的IP地址
13 bindPort: 6443
......
34 kubernetesVersion: v1.20.11 #指定kubernetes版本号
35 networking:
36 dnsDomain: cluster.local
37 podSubnet: "10.244.0.0/16" #指定pod网段,10.244.0.0/16用于匹配flannel默认网段
38 serviceSubnet: 10.96.0.0/16 #指定service网段
39 scheduler: {}
#末尾再添加以下内容
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
-
kubeadm config print init-defaults > /opt/kubeadm-config.yaml
:将kubeadm的初始化默认配置打印到/opt/kubeadm-config.yaml文件中。 -
cd /opt/
:进入/opt目录。 -
vim kubeadm-config.yaml
:使用vim编辑器打开kubeadm-config.yaml文件进行配置。 -
在文件中进行相应的配置,如指定master节点的IP地址、kubernetes版本号、pod网段、service网段等。根据实际需求进行相应的修改。
-
apiVersion: kubeproxy.config.k8s.io/v1alpha1
:指定了KubeProxyConfiguration的API版本。 -
kind: KubeProxyConfiguration
:指定了配置的类型为KubeProxyConfiguration。 -
mode: ipvs
:将kube-proxy的调度方式设置为ipvs模式。可以使用IPVS作为负载均衡器,提供更高效和可扩展的服务代理功能
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
这个命令用于使用指定的配置文件进行kubeadm的初始化,并将输出日志保存到kubeadm-init.log文件中。
-
kubeadm init
:执行kubeadm的初始化操作。 -
--config=kubeadm-config.yaml
:指定使用kubeadm-config.yaml文件作为配置文件进行初始化。 -
--upload-certs
:在初始化过程中自动分发证书文件给后续加入的节点。 -
--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs
-
| tee kubeadm-init.log
:将命令的输出同时显示在终端上,并将输出内容保存到kubeadm-init.log文件中。
通过这个命令,可以使用指定的配置文件进行kubeadm的初始化,并将初始化过程的输出保存到日志文件中,方便后续查看和分析。
注意这段输出
这段是后面关于如何将工作节点加入到Kubernetes集群中的说明。
kubeadm join 192.168.41.31:6443 --token abcdef.0123456789abcdef
:这个命令用于将工作节点加入到Kubernetes集群中。其中,192.168.41.31:6443
是Master节点的地址和端口号,abcdef.0123456789abcdef
是一个示例的令牌(Token),用于验证工作节点的身份。
在每个工作节点上,以root用户身份运行上述命令,将工作节点加入到Kubernetes集群中。
检查
#查看 kubeadm-init 日志
less kubeadm-init.log#kubernetes配置文件目录
ls /etc/kubernetes/#存放ca等证书和密码的目录
ls /etc/kubernetes/pki
-
less kubeadm-init.log
:使用less
命令查看kubeadm-init.log
文件的内容。这个日志文件记录了kubeadm初始化过程的输出信息。 -
ls /etc/kubernetes/
:列出/etc/kubernetes/
目录下的文件和子目录。这个目录是Kubernetes的配置文件目录,包含了Kubernetes集群的各种配置文件。 -
ls /etc/kubernetes/pki
:列出/etc/kubernetes/pki
目录下的文件和子目录。这个目录是存放Kubernetes集群的CA证书和密码的目录。
通过这些命令,可以查看kubeadm初始化的日志,了解初始化过程的输出信息,并查看Kubernetes的配置文件目录和存放CA证书和密码的目录
方法二
kubeadm init \
--apiserver-advertise-address=192.168.41.31 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.20.11 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--token-ttl=0
-
--apiserver-advertise-address=192.168.41.31
:指定Master节点的IP地址,用于广告宣传Kubernetes API服务器的地址。 -
--image-repository registry.aliyuncs.com/google_containers
:指定容器镜像的仓库地址,这里使用了阿里云的镜像仓库地址。 -
--kubernetes-version=v1.20.11
:指定Kubernetes的版本号为v1.20.11。 -
--service-cidr=10.96.0.0/16
:指定Service的IP地址段,用于分配给Service的Cluster IP。 -
--pod-network-cidr=10.244.0.0/16
:指定Pod的IP地址段,用于分配给Pod。 -
--token-ttl=0
:指定Token的有效期,这里设置为0表示Token永不过期。
通过执行这个命令,可以使用指定的参数进行kubeadm的初始化。
使用方法二初始化Kubernetes集群后,可以通过修改kube-proxy的ConfigMap来开启ipvs模式。使用以下命令来编辑kube-proxy的ConfigMap:
kubectl edit cm kube-proxy -n kube-system
这个命令将打开一个文本编辑器,允许修改kube-proxy的配置。在编辑器中找到mode
字段,并将其值修改为ipvs
。保存并关闭编辑器后,kube-proxy将使用ipvs模式进行调度。
设置kubectl的配置文件
kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
-
mkdir -p $HOME/.kube
:创建一个名为".kube"的目录,用于存放kubectl的配置文件。 -
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
:将/etc/kubernetes/admin.conf文件复制到$HOME/.kube/config文件中。这个配置文件是具有管理员权限的认证配置文件。 -
chown $(id -u):$(id -g) $HOME/.kube/config
:将$HOME/.kube/config文件的所有者设置为当前用户。这样可以确保当前用户对kubectl配置文件的访问权限。
通过执行这些命令,可以将kubeadm部署的集群生成的管理员权限的认证配置文件复制到kubectl的默认配置文件路径中。这样,kubectl就可以通过加载该配置文件来进行API server的认证和授权,并执行相应的管理操作。
如果 kubectl get cs 发现集群不健康,更改以下两个文件
修改kube-scheduler.yaml和kube-controller-manager.yaml文件的内容,并重新启动kubelet服务。
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml# 修改如下内容
把--bind-address=127.0.0.1变成--bind-address=192.168.41.31 #修改成k8s的控制节点master01的ip
把httpGet:字段下的hosts由127.0.0.1变成192.168.41.31(注意有两处)
#- --port=0 # 把这一行注释掉
-
把--bind-address=127.0.0.1变成--bind-address=192.168.41.31
:这个修改将把--bind-address
参数的值从127.0.0.1
改为k8s的控制节点master01的IP地址,以便让kube-scheduler和kube-controller-manager绑定到正确的IP地址上。 -
把httpGet:字段下的hosts由127.0.0.1变成192.168.41.31
:这个修改将kube-scheduler和kube-controller-manager的健康检查地址中的hosts
字段的值从127.0.0.1
改为k8s的控制节点master01的IP地址,以便正确检查它们的健康状态。 -
#- --port=0
:这个修改是将--port=0
这一行注释掉。这行配置是用于指定kube-scheduler和kube-controller-manager的监听端口,注释掉后将使用默认的端口。
systemctl restart kubelet
执行systemctl restart kubelet
命令后,kubelet服务将重新启动,并应用新的配置。
kubectl get cs
启动可能会花一些时间,所以多检查几次确保状态健康
所有节点部署网络插件flannel
方法一
所有节点上传flannel镜像 flannel.tar 到 /opt 目录,master节点上传 kube-flannel.yml 文件
cd /opt
docker load < flannel.tar
-
cd /opt
:进入/opt目录。 -
docker load < flannel.tar
:使用docker命令加载flannel.tar镜像文件。确保已将flannel.tar镜像文件上传到所有节点的/opt目录下。 -
kubectl apply -f kube-flannel.yml
:使用kubectl命令应用kube-flannel.yml文件,该文件包含了创建flannel网络插件所需的资源配置。确保已将kube-flannel.yml文件上传到Master节点。
通过执行这些操作,可以在所有节点上部署flannel网络插件。
在 master 节点创建 flannel 资源
kubectl apply -f kube-flannel.yml
创建flannel网络插件所需的资源。这个命令会根据kube-flannel.yml文件中的配置,创建相应的Pod、Service和其他资源,以部署和配置flannel网络插件。
方法二
用于部署flannel网络插件和将节点加入Kubernetes集群的操作。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
:使用kubectl命令从远程URL下载kube-flannel.yml文件,并应用其中的配置来部署flannel网络插件。
node 节点上执行 kubeadm join 命令加入群集
kubeadm join 192.168.41.31:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:760e26c39a976d079a8024f6fdab99bcfc30451397e12a99
- 在节点上执行此命令,将节点加入Kubernetes集群。这个命令中的参数包括Master节点的IP地址和端口、加入令牌以及CA证书哈希等信息。
在master节点查看节点状态
kubectl get nodeskubectl get pods -n kube-system
-
kubectl get nodes
:在Master节点上执行此命令,查看集群中的节点状态。这将显示已加入集群的节点列表。 -
kubectl get pods -n kube-system
:在Master节点上执行此命令,查看kube-system命名空间中的Pod状态。这将显示kube-system命名空间中的所有Pod,包括flannel网络插件的Pod。
请确保在执行这些操作之前,已经安装并配置好了kubectl工具
节点状态
Kubernetes节点的STATUS字段表示节点的状态。以下是一些常见的节点状态:
-
Ready(就绪):节点正常运行且准备好接受工作负载。这是节点的正常工作状态。
-
NotReady(未就绪):节点无法接受工作负载,可能由于某些问题导致节点无法正常工作。
-
Unknown(未知):节点的状态未知,可能由于与节点的通信问题或其他原因导致无法获取节点的状态信息。
-
SchedulingDisabled(禁用调度):节点上的调度功能被禁用,因此不会将新的Pod调度到该节点上。
-
OutOfDisk(磁盘空间不足):节点的磁盘空间不足,无法容纳新的Pod。
-
MemoryPressure(内存压力):节点的内存资源不足,无法容纳新的Pod。
-
DiskPressure(磁盘压力):节点的磁盘资源不足,无法容纳新的Pod。
-
PIDPressure(进程ID压力):节点的进程ID资源不足,无法容纳新的Pod。
-
NetworkUnavailable(网络不可用):节点的网络不可用,无法与其他节点或集群通信。
这些节点状态可以通过运行kubectl get nodes
命令来查看。在输出结果中,STATUS列将显示节点的当前状态。
测试pod资源
创建了一个名为nginx的Pod,并将其公开为一个NodePort类型的服务
创建pod并检查
kubectl create deployment nginx --image=nginxkubectl get pods -o wide
-
kubectl create deployment nginx --image=nginx
:这个命令创建了一个名为nginx的Deployment,并使用nginx镜像作为容器。 -
kubectl get pods -o wide
:这个命令用于获取Pod的信息,并使用-o wide
参数显示更详细的输出。输出结果显示了Pod的名称、就绪状态、状态、重启次数、IP地址、所在的节点等信息。
暴露端口提供服务
kubectl expose deployment nginx --port=80 --type=NodePortkubectl get svc
-
kubectl expose deployment nginx --port=80 --type=NodePort
:这个命令用于将nginx Deployment公开为一个NodePort类型的服务,并将容器的80端口映射到Node上的一个随机端口。 -
kubectl get svc
:这个命令用于获取服务的信息。输出结果显示了服务的名称、类型、集群IP、外部IP(如果有)、端口等信息。
测试访问
使用curl命令从Node节点上访问服务
curl http://node01:31201
扩展副本
kubectl scale deployment nginx --replicas=3
kubectl get pods -o wide
-
kubectl scale deployment nginx --replicas=3
:这个命令用于扩展nginx Deployment的副本数为3个。通过指定--replicas
参数并设置为3,您告诉Kubernetes将副本数扩展到3个。 -
kubectl get pods -o wide
:这个命令用于获取Pod的信息,并使用-o wide
参数显示更详细的输出。输出结果显示了Pod的名称、就绪状态、状态、重启次数、IP地址、所在的节点等信息。
扩展副本的作用
扩展副本是为了增加应用程序的可用性和负载处理能力。
-
高可用性:通过扩展副本,可以在多个节点上运行应用程序的多个副本。如果其中一个副本发生故障或不可用,其他副本仍然可以继续提供服务,从而提高应用程序的可用性。
-
负载均衡:通过扩展副本,可以将负载分布到多个副本上,从而平衡应用程序的负载。这有助于避免单个副本过载,提高应用程序的性能和响应能力。
-
处理高流量:当应用程序面临高流量时,通过扩展副本可以增加处理请求的能力。每个副本都可以处理一部分请求,从而提高整体的处理能力。
-
故障恢复:如果某个副本发生故障或需要进行维护,其他副本仍然可以继续提供服务。当故障副本恢复后,它可以重新加入到副本集中,从而实现故障恢复和无缝的服务切换。
通过扩展副本,可以提高应用程序的可靠性、性能和可扩展性。这对于处理不断增长的用户请求、应对故障和提供高可用性的应用程序至关重要。根据实际需求和负载情况,可以根据需要动态地调整副本数。
部署 Dashboard
在Master01节点上进行以下操作
将recommended.yaml文件上传到/opt/k8s目录中
cd /opt/k8s
vim recommended.yaml#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443nodePort: 30001 #添加type: NodePort #添加selector:k8s-app: kubernetes-dashboard
添加了nodePort: 30001
和type: NodePort
字段,将Service类型设置为NodePort,并指定了NodePort的值为30001。
应用配置
使用命令kubectl apply -f recommended.yaml
将修改后的配置应用到Kubernetes集群中。
kubectl apply -f recommended.yaml
创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
-
创建名为dashboard-admin的ServiceAccount,并将其放置在kube-system命名空间中。使用命令
kubectl create serviceaccount dashboard-admin -n kube-system
创建ServiceAccount。 -
创建名为dashboard-admin的ClusterRoleBinding,并将其绑定到cluster-admin集群角色上。使用命令
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
创建ClusterRoleBinding。 -
获取dashboard-admin ServiceAccount的凭据。使用命令
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
获取与dashboard-admin ServiceAccount关联的凭据。
请注意,这些命令将创建一个名为dashboard-admin的ServiceAccount,并将其与cluster-admin集群角色绑定。这将赋予dashboard-admin ServiceAccount管理员权限。可以使用获取凭据的命令来查看与ServiceAccount关联的凭据。
使用输出的token登录Dashboard
https://192.168.41.31:30001
请确保替换URL中的IP地址和端口号为正确的值,以便与你的环境相匹配。这个URL使用HTTPS协议,并指定了节点的IP地址和NodePort端口号来访问Kubernetes Dashboard。
相关文章:

k8s kubeadm部署安装详解
目录 kubeadm部署流程简述 环境准备 步骤简述 关闭 防火墙规则、selinux、swap交换 修改主机名 配置节点之间的主机名解析 调整内核参数 所有节点安装docker 安装依赖组件 配置Docker 所有节点安装kubeadm,kubelet和kubectl 定义kubernetes源并指定版本…...

RT-DETR算法优化改进: 下采样系列 | 一种新颖的基于 Haar 小波的下采样HWD,有效涨点系列
💡💡💡本文独家改进:HWD的核心思想是应用Haar小波变换来降低特征图的空间分辨率,同时保留尽可能多的信息,与传统的下采样方法相比,有效降低信息不确定性。 💡💡💡使用方法:代替原始网络的conv,下采样过程中尽可能包括更多信息,从而提升检测精度。 RT-DET…...

CocosCreator3.8源码分析
Cocos Creator架构 Cocos Creator 拥有两套引擎内核,C 内核 和 TypeScript 内核。C 内核用于原生平台,TypeScript 内核用于 Web 和小游戏平台。 在引擎内核之上,是用 TypeScript 编写的引擎框架层,用以统一两套内核的差异…...

(已解决)spingboot 后端发送QQ邮箱验证码
打开QQ邮箱pop3请求服务:(按照QQ邮箱引导操作) 导入依赖(不是maven项目就自己添加jar包): <!-- 邮件发送--><dependency><groupId>org.springframework.boot</groupId><…...

【蓝桥杯冲冲冲】[NOIP2001 普及组] 装箱问题
蓝桥杯备赛 | 洛谷做题打卡day26 文章目录 蓝桥杯备赛 | 洛谷做题打卡day26题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 题解代码我的一些话 [NOIP2001 普及组] 装箱问题 题目描述 有一个箱子容量为 V V V,同时有 n n n 个物品,每…...

2024牛客寒假算法基础集训营1
文章目录 A DFS搜索M牛客老粉才知道的秘密G why外卖E 本题又主要考察了贪心B 关鸡C 按闹分配 今天的牛客,说是都是基础题,头昏昏的,感觉真不会写,只能赛后补题了 A DFS搜索 写的时候刚开始以为还是比较难的,和dfs有关…...

元素的显示与隐藏,精灵图,字体图标,CSSC三角
元素的显示与隐藏 类似网站广告,当我们点击关闭就不见了,但是我们重新刷新页面,会重新出现 本质:让元素在页面中隐藏或者显示出来。 1.display显示隐藏 2.visibility显示隐藏 3.overflow溢出显示隐藏 1.display属性(…...

最新!2024顶级SCI优化!TTAO-CNN-BiGRU-MSA三角拓扑聚合优化、双向GRU融合注意力的多变量回归预测程序!
适用平台:Matlab 2023版及以上 TTOA三角聚合优化算法,将在2024年3月正式发表在中科院1区顶级SCI期刊《Expert Systems with Applications》上。 该算法提出时间极短,目前以及近期内不会有套用这个算法的文献。新年伊始,尽快拿下…...
Flink SQL Client 安装各类 Connector、组件的方法汇总(持续更新中....)
一般来说,在 Flink SQL Client 中使用各种 Connector 只需要该 Connector 及其依赖 Jar 包部署到 ${FLINK_HOME}/lib 下即可。但是对于某些特定的平台,如果 AWS EMR、Cloudera CDP 等产品会有所不同,主要是它们中的某些 Jar 包可能被改写过&a…...

React18-模拟列表数据实现基础表格功能
文章目录 分页功能分页组件有两种接口参数分页类型用户列表参数类型 模拟列表数据分页触发方式实现目录 分页功能 分页组件有两种 table组件自带分页 <TableborderedrowKey"userId"rowSelection{{ type: checkbox }}pagination{{position: [bottomRight],pageSi…...

MySQL查询数据(十)
MySQL查询数据(十) 一、SELECT基本查询 1.1 SELECT语句的功能 SELECT 语句从数据库中返回信息。使用一个 SELECT 语句,可以做下面的事: **列选择:**能够使用 SELECT 语句的列选择功能选择表中的列,这些…...

AJAX-常用请求方法和数据提交
常用请求方法 请求方法:对服务器资源,要执行的操作 axios请求配置 url:请求的URL网址 method:请求的方法,如果是GET可以省略;不用区分大小写 data:提交数据 axios({url:目标资源地址,method…...

2024美国大学生数学建模竞赛美赛B题matlab代码解析
2024美赛B题Searching for Submersibles搜索潜水器 因为一些不可抗力,下面仅展示部分代码(很少部分部分)和部分分析过程,其余代码看文末 Dthxlsread(C:\Users\Lenovo\Desktop\Ionian.xlsx); DpDth(:,3:5); dy0.0042; dx0.0042; …...
【DouYing Desktop】
I) JD 全日制大专及以上学历; 2. 3年以上的IT服务支持相关工作经验 3. 有较强的桌面相关trouble shooting与故障解决能力,能够独立应对各类型桌面问题; 4. 具备基础的网络、系统知识,能够独立解决常见的网络、系统等问题…...

正则表达式与文本处理工具
目录 引言 一、正则表达式基础 (一)字符匹配 1.基本字符 2.特殊字符 3.量词 4.边界匹配 (二)进阶用法 1.组与引用 2.选择 二、命令之-----grep (一)基础用法 (二)高级用…...

IDEA中的Run Dashboard
Run Dashboard是IntelliJ IDEA中的工具【也就是View中的Services】,提供一个可视化界面,用于管理控制应用程序的运行和调试过程。 在Run DashBoard中,可以看到所有的运行配置,以及每个配置的运行状态(正在运行…...

【力扣白嫖日记】SQL
前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 1407.排名靠前的旅行者 表:Users 列名类型idintnamevarchar id 是该表中具有唯一值的列。name …...
自动化报告pptx-python|高效通过PPT模版制造报告(三)
这是自动化报告学习的第三篇了,前面两篇分别是: 自动化报告的前奏|使用python-pptx操作PPT(一)自动化报告pptx-python|如何将pandas的表格写入PPTX(二)本篇是逼着笔者看到JoStudio 大佬自己写的一个jojo-office 库,基于pptx-python开发成一套试用office软件的依赖,非…...
Linux升级openssh的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

YOLOv5白皮书-第Y3周:yolov5s.yaml文件解读
YOLOv5白皮书-第Y3周:yolov5s.yaml文件解读 YOLOv5白皮书-第Y3周:yolov5s.yaml文件解读一、前言二、我的环境三、yolov5s.yaml源文件内容四、Parameters五、anchors配置六、backbone七、head八、总结 OLOv5-第Y2周:训练自己的数据集) YOLOv5白皮书-第Y3周:yolov5s.…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

python可视化:俄乌战争时间线关键节点与深层原因
俄乌战争时间线可视化分析:关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一,自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具,系统分析这场战争的时间线、关键节点及其背后的深层原因,全面…...

解决MybatisPlus使用Druid1.2.11连接池查询PG数据库报Merge sql error的一种办法
目录 前言 一、问题重现 1、环境说明 2、重现步骤 3、错误信息 二、关于LATERAL 1、Lateral作用场景 2、在四至场景中使用 三、问题解决之道 1、源码追踪 2、关闭sql合并 3、改写处理SQL 四、总结 前言 在博客:【写在创作纪念日】基于SpringBoot和PostG…...