k8s kubeadm部署安装详解

news2024/11/25 8:46:37

目录

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。

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

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

相关文章

UE4 C++ UGameInstance实例化

1.创建GameInstance C类 2.在.h添加变量 class 工程名称_API UMyGameInstance : public UGameInstance {GENERATED_BODY()public: //定义了三个公开的变量UMyGameInstance();UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "MyGameInstance")FString Name…

天线阵列车载应用——前言

本书的总体结构 这本参考书向读者介绍了汽车工业中使用的尖端天线阵列技术。新型通信多阵元天线系统是一种非常有前途的车载设备。例如&#xff0c;智能车辆公路系统(IVHS)包括车对车通信、汽车到路边系统、防撞雷达天线阵列和用于自动巡航控制应用的智能天线阵列&#xff0c;为…

vue 阿里图标库引入分享

上篇文章分享了element-ui icon 组件的实现原理&#xff0c;文章当中有涉及到了阿里图标库的使用&#xff0c;当时未做详细使用说明&#xff0c;此篇文章是对上篇文章的补充哈。 本篇文章主要分为以下两部分&#xff1a; 一、阿里图标库使用 1.1 阿里图标库地址&#xff1a;…

在linux(centos)上运行C语言文件

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.下载gcc2.创建C语言…

2024美赛数学建模D题思路分析 - 大湖区水资源问题

1 赛题 问题D&#xff1a;大湖区水资源问题 背景 美国和加拿大的五大湖是世界上最大的淡水湖群。这五个湖泊和连接的水道构成了一个巨大的流域&#xff0c;其中包含了这两个国家的许多大城市地区&#xff0c;气候和局部天气条件不同。 这些湖泊的水被用于许多用途&#xff0…

Oracle篇—普通表迁移到分区表(第五篇,总共五篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

音箱、功放播放HDMI音频解决方案之HDMI音频分离器HHA

HDMI音频分离器HHA简介 HDMI音频分离器HHA具有一路HDMI信号输入&#xff0c;转换成一路HDMI信号、一路5.1光纤音频信号、一路5.1 SPDIF/同轴音频信号和一路模拟左右声道立体声信号输出&#xff0c;同时还支持EDID存储及兼容HDCP功能&#xff1b;分辨率最高支持1920*1080p&#…

OpenHarmony—开发及引用静态共享包(API 9)

HAR(Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块的依赖项被引用。 接下来&a…

JVM工作原理与实战(三十二):GC调优

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、GC调优 二、GC调优的核心指标 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节码&#xff0c;管理内存&#xff0c;确保安全&#xff0c;支持多线程和提供…

嵌入式软件工程师面试题——2025校招社招通用(C/C++)(五十一)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

推荐系统|概要03_AB测试

文章目录 A/B测试问题流量不够用解决方案——分层实验 Holdout 机制 A/B测试 其中小流量是指对部分的用户先尝试改进的算法模型&#xff0c;而非全部。若为全部&#xff0c;如果算法模型存在问题&#xff0c;可能会导致用户体验差&#xff0c;导致用户流失&#xff0c;而小流量…

SOME/IP SD 协议介绍(五)使用SOME/IP-SD宣布非SOME/IP协议的协议。

使用SOME/IP-SD宣布非SOME/IP协议的协议。 除了SOME/IP之外&#xff0c;车辆内部还使用其他通信协议&#xff0c;例如用于网络管理、诊断或闪存更新。这些通信协议可能需要传递服务实例或具有事件组。 对于非SOME/IP协议&#xff0c;应使用特殊的服务ID&#xff0c;并使用配置…

【python3.8 pre-commit报错】记录pre-commit install报错

一、问题 在执行pre-commit install --allow-missing-config命令时&#xff0c;报错 Traceback (most recent call last):File "C:\ProgramData\Anaconda3\envs\py38\lib\runpy.py", line 192, in _run_module_as_mainreturn _run_code(code, main_globals, None,F…

【智能算法】11种混沌映射算法+2种智能算法示范【鲸鱼WOA、灰狼GWO算法】

1 主要内容 混沌映射算法是我们在智能算法改进中常用到的方法&#xff0c;本程序充分考虑改进算法应用的便捷性&#xff0c;集成了11种混合映射算法&#xff0c;包括Singer、tent、Logistic、Cubic、chebyshev、Piecewise、sinusoidal、Sine、ICMIC、Circle、Bernoulli&#xf…

Python 生成图片验证码

图片验证码&#xff08;CAPTCHA&#xff09;是一种区分用户是计算机还是人的公共全自动程序。这种验证码通常以图片的形式出现&#xff0c;其中包含一些扭曲的字符或对象&#xff0c;用户需要识别这些字符或对象并输入正确的答案以通过验证。 通常情况下&#xff0c;图片验证码…

linux有关安全的几个基本配置,禁止root登录,新建root权限账号

一、不安装多余的软件&#xff0c;能最小化安装就不要安装图形化界面&#xff0c;然后根据需求安装需要的软件。 二、防火墙要启用&#xff0c;如果您的这台服务器对外有服务只要放开服务就好了&#xff0c;就是说白了白名单&#xff0c;切忌一上来第一件事儿就是关闭防火墙&a…

供应商规模成倍增长,医疗器械制造商如何让采购效率更进一步|创新场景50...

ITValue 随着企业的快速发展&#xff0c;采购供应链网络日益庞大&#xff0c;企业在供应商管理上面临着管理体系分散、风险难以管控&#xff0c;采购过程环节多等问题&#xff0c;供应商内外协同亟待解决。 作者&#xff5c;秦聪慧 专题&#xff5c;创新场景50 ITValue 制造企业…

新媒体与传媒行业数据分析实践:从网络爬虫到文本挖掘的综合应用,以“中国文化“为主题

大家好&#xff0c;我是八块腹肌的小胖&#xff0c; 下面将围绕微博“中国文化”以数据分析、数据处理、建模及可视化等操作 目录 1、数据获取 2、数据处理 3、词频统计及词云展示 4、文本聚类分析 5、文本情感倾向性分析 6、情感倾向演化分析 7、总结 1、数据获取 本…

iOS图像处理----探索图片解压缩到渲染的全过程以及屏幕卡顿

一&#xff1a;图像成像过程 ①、将需要显示的图像&#xff0c;由CPU和GPU通过总线连接起来&#xff0c;在CPU中输出的位图经总线在合适的时机上传给GPU &#xff0c;GPU拿到位图做相应位图的图层渲染、纹理合成。 ②、将渲染后的结果&#xff0c;存储到帧缓存区&#xff0c;帧…

四大组件 - ContentProvider

参考&#xff1a;Android 这 13 道 ContentProvider 面试题&#xff0c;你都会了吗&#xff1f; 参考&#xff1a;《Android 开发艺术探索》 第 9.5 节&#xff08;ContentProvider 的工作过程&#xff09; 参考&#xff1a;内容提供者程序 参考&#xff1a;<provider>&g…