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/hosts

192.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
EOF

yum 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.yaml

cd /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 nodes

kubectl 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=nginx

kubectl 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=NodePort

kubectl 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-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001     #添加
  type: NodePort          #添加
  selector:
    k8s-app: kubernetes-dashboard 

添加了nodePort: 30001type: 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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

带大家做一个,易上手的家常芹菜炒腊肉

起锅 放入腊肉 加入清水 水包裹住腊肉即可 盖上盖子煮15分钟 一把芹菜 芹菜切段 清水洗干净 15分钟后 捞出腊肉 将腊肉切片 一块生姜 两瓣蒜 将蒜切片 单独装起来 生姜切片 和三个干辣椒装一起 起锅 下腊肉 不要放油 腊肉够油了 翻炒开后 倒入生姜 干辣椒 翻炒个一分…

STM32CAN2进入bus off 模式

工作遇到的问题记录 无人机CAN2整个进不了中断&#xff0c;通过查看寄存器判定出CAN节点进入了bus off mode 为何进入bus off &#xff0c;最后通过示波器看到整个CAN2总线波形就不对&#xff0c;总线出现了错误 Busoff的产生是一定是因为节点自身识别到自己发送错误&#xff…

Modbus协议学习第七篇之libmodbus库API介绍(modbus_write_bits等)

写在前面 在第六篇中我们介绍了基于libmodbus库的演示代码&#xff0c;那本篇博客就详细介绍一下第六篇的代码中使用的基于该库的API函数。另各位读者&#xff0c;Modbus相关知识受众较少&#xff0c;如果觉得我的专栏文章有帮助&#xff0c;请一定点个赞&#xff0c;在此跪谢&…

oracle19C 密码包含特殊字符@ 导致ORA-12154

oracle 19C 密码包含特殊字符 出现登录失败&#xff0c;针对此问题一次说个明白 ORA-12154: TNS:could not resolve the connect identifier specified Oracle 19c之前密码是可以包含特殊字符&#xff0c;但是如果包含特殊字符需要双引号 比如oracle11g 正常 如果密码包含特殊…

Redis的bitmap使用不当,我内存爆了

背景 最近发现Redis的内存持续暴涨&#xff0c; 涨的有点吓人&#xff0c;机器都快扛不住了&#xff0c;不得不进行Redis内存可视化分析&#xff0c;发现大量的String类型的大key 经分析&#xff0c;最近上线了页面UV的统计&#xff0c;那目前如何做的呢&#xff1f; 通过访…

【iOS ARKit】2D肢体动作捕捉

人体肢体动作捕捉在动漫影视制作、游戏CG 动画、实时模型驱动中有着广泛的应用&#xff0c;利用 ARKit&#xff0c;无须额外的硬件设备即可实现 2D和3D人体一系列关节和骨骼的动态捕捉&#xff0c;由于移动AR 的便携性及低成本&#xff0c;必将促进相关产业的发展。 ARBody Tr…

图片热区功能

一、需求描述及效果图 1.需求描述&#xff1a; 根据后端返回的坐标及人员信息&#xff0c;在图片上的相应位置添加图片热区功能&#xff0c;点击可展示出对应的人员信息。 图片可进行缩放 2.示例&#xff1a; &#xff08;定位是随便写的&#xff0c;仅做示例&#xff09; …

【Algorithms 4】算法(第4版)学习笔记 03 - 1.3 背包、队列和栈

文章目录 前言参考目录学习笔记0&#xff1a;预热1&#xff1a;栈1.1&#xff1a;栈的链表实现1.1.1 代码实现1.2&#xff1a;栈的数组实现1.2.1&#xff1a;定容栈1.2.2&#xff1a;可调整大小数组1.2.3&#xff1a;代码实现1.3&#xff1a;链表与数组的取舍2&#xff1a;队列…

MySQL原理(一)架构组成之逻辑模块(1)组成

总的来说&#xff0c;MySQL可以看成是二层架构&#xff0c;第一层我们通常叫做SQL Layer&#xff0c;在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的&#xff0c;包括权限判断&#xff0c;sql解析&#xff0c;执行计划优化&#xff0c;query cache的处理等等&…

算法——A/算法通识

目录 一、复杂度分析 A/时间复杂度 B/空间复杂度 C/分析技巧 二、枚举分析 A/枚举算法介绍 B/解空间的类型 C/循环枚举解空间 三、模拟算法 四、递归 A/递归介绍 递归的两个关键要素&#xff1a; B/递归如何实现 C/递归和循环的比较 一、复杂度分析 A/时间复杂度…

AVL树

文章目录 AVL树平衡因子 AVL树结点的定义AVL树类和函数接口AVL树插入元素最小不平衡子树旋转 AVL树的验证参考源码 AVL树是对普通二叉搜索树的一种优化。当二叉搜索树插入的元素是有序的时候或者接近有序的时候&#xff0c;二叉搜索树的性能会大大降低。二叉搜索树可能会变成一…

中二少年工具箱(PC端)简介

同学们可以私信我加入学习群&#xff01; 正文开始 简介一、功能模块1.node版本管理工具 总结 简介 中二少年开发的中二少年工具箱&#xff0c;相信博主&#xff0c;功能不孬。 辅助自己开发工作&#xff0c;帮助新人快速入门&#xff0c;提供交互式文档辅助学习……如果还不…

LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建 LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果 LDRA Testb…

arcgis自定义dem高程实现地形抬高 - 操作矢量,转tin、adf(tif),cesiumlab切高程服务

这次记录分享一下arcgis自定义高程全过程 /(ㄒoㄒ)/~~ 我的场景&#xff1a;前端实现地面抬高效果 自定义高程实现地形抬高 一、数据处理 - arcgis操作矢量1、准备工作&#xff08;可选&#xff09;2、绘制外围矢量&#xff08;可选&#xff09;3、操作矢量数据 二、创建tin - …

opencvb 十七 使用cmake配置opencv c++项目

1、cmake简介 1.1 cmake是什么 CMake是一个开源、跨平台的编译&#xff08;Build&#xff09;工具&#xff0c;是用来构建、测试和打包软件的。它能够用简单的语句来描述所有平台的编译过程。它能够输出各种各样的makefile或者project文件&#xff0c;能测试编译器所支持的C特…

记录一次k8s集群镜像恢复到harbor的过程

之前由于harbor的存储空间不够了&#xff0c;同事干掉了好多镜像&#xff0c;结果把现网生产的镜像也搞掉了。进行了找回操作&#xff0c;这里做下记录。 环境是k8s集群&#xff0c;容器引擎用的containerd。 最初发现这个问题是在增加节点的时候&#xff0c;发现有的节点主机…

【DPI(Direct Programming Interface)_2024.02.01】

DPI接口&#xff1a;实现SV与C的交互 ① DPI_svc test.sv文件&#xff1a; 从C import task/function到SV 从SV export task到C 利用DPI调用C code访问register test.c文件&#xff1a; C调用apb_write驱动 ② dpi_perl test.sv文件&#xff1a; 利用DPI调用c code间接调…

CKS1.28【1】kube-bench 修复不安全项

Context 针对 kubeadm 创建的 cluster 运行 CIS 基准测试工具时&#xff0c;发现了多个必须立即解决的问题。 Task 通过配置修复所有问题并重新启动受影响的组件以确保新的设置生效。 修复针对 API 服务器发现的所有以下违规行为&#xff1a; 1.2.7 Ensure that the --authoriz…

【华为】GRE Over IPsec 实验配置

【思科】GRE Over IPsec 实验配置 前言报文格式 实验需求配置拓扑GRE配置步骤IPsec 配置步骤R1基础配置GRE 配置IPsec 配置 ISP_R2基础配置 R3基础配置GRE 配置IPsec 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立IPsec 隧道建立Ping 配置文档 前言 GRE over IPSec可利用GRE和IP…

echarts条形图添加滚动条

效果展示: 测试数据: taskList:[{majorDeptName:测试,finishCount:54,notFinishCount:21}, {majorDeptName:测试,finishCount:54,notFinishCount:21}, {majorDeptName:测试,finishCount:54,notFinishCount:21}, {majorDeptName:测试,finishCount:54,notFinishCount:21}, {maj…