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: 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.rhkb.cn/news/250290.html

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

相关文章

网络异常案例四_IP异常

问题现象 终端设备离线&#xff0c;现场根据设备ip&#xff0c;ping不通。查看路由器。 同一个路由器显示的终端设备&#xff08;走同一个wifi模块接入&#xff09;&#xff0c;包含不同网段的ip。 现场是基于三层的无线漫游&#xff0c;多个路由器wifi配置了相同的ssid信息&a…

某赛通电子文档安全管理系统 UploadFileToCatalog SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

【机器学习】AAAI 会议论文聚类分析

实验五&#xff1a;AAAI 会议论文聚类分析 ​ 本次实验以AAAI 2014会议论文数据为基础&#xff0c;要求实现或调用无监督聚类算法&#xff0c;了解聚类方法。 1 任务介绍 ​ 每年国际上召开的大大小小学术会议不计其数&#xff0c;发表了非常多的论文。在计算机领域的一些大…

【二进制漏洞】缓冲区溢出漏洞

天命&#xff1a;好像复现成功了&#xff0c;又好像没有完全成功 学习视频&#xff1a;抓住漏洞&#xff01;缓冲区溢出漏洞利用实例&#xff0c;如何利用溢出执行Shell Code_哔哩哔哩_bilibili 漏洞复现 实验环境&#xff1a;kali &#xff08;其实啥都试过&#xff0c;windo…

Linux基础知识合集

整理了一下学习的一些关于Linux的一些基础知识&#xff0c;同学们也可以通过公众号菜单栏查看&#xff01; 一、基础知识 Linux基础知识 Linux命令行基础学习 Linux用户与组概念初识 Linux文件与目录权限基础 Linux中文件内容的查看 Linux系统之计划任务管理 二、服务器管理 Vm…

通过与chatGPT交流实现零样本事件抽取

1、写作动机&#xff1a; 近来的大规模语言模型&#xff08;例如Chat GPT&#xff09;在零样本设置下取得了很好的表现&#xff0c;这启发作者探索基于提示的方法来解决零样本IE任务。 2、主要贡献&#xff1a; 提出了基于chatgpt的多阶段的信息抽取方法&#xff1a;在第一阶…

DHCP简介

定义 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种用于集中对用户IP地址进行动态管理和配置的技术。即使规模较小的网络&#xff0c;通过DHCP也可以使后续增加网络设备变得简单快捷。 DHCP是在BOOTP&#xff08;BOOTstrap Protoc…

[GN] 设计模式—— 创建型模式

文章目录 创建型模式单例模式 -- 确保对象唯一性例子优化饿汉式懒汉式 优缺点使用场景 简单工厂模式例子&#xff1a;优化优缺点适用场景 工厂方法模式 -- 多态工厂的实现例子优缺点优化适用场景 抽象工厂模式 -- 产品族的创建例子优缺点适用场景 总结 创建型模式 单例模式 –…

公共用例库计划--个人版(六)典型Bug页面设计与开发

1、任务概述 本次计划的核心任务是开发一个&#xff0c;个人版的公共用例库&#xff0c;旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理&#xff0c;并以提高用例的复用率为目标&#xff0c;力求最大限度地减少重复劳动&#xff0c;提升…

接口安全测试

一、后台接口分类 1、接口类别&#xff1a;restful(json) soap(xml) 2、协议 &#xff1a;http https(ssl) 3、restful接口请求类型 get操作是安全的 post的操作是不安全的 同put delete也是不安全的 4、现状和问题 大部分APP的接口都采用restful架构&#xff0c;restful…

G7-Semi-Supervised GAN解读

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 1.语言&#xff1a;python3.7 2.编译器&#xff1a;pycharm 3.深度学习框架Pytorch 1.8.0cu111 论文地址 一、理论理解 半监督生成对抗网络&…

C语言系列-联合

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 联合体 联合体类型的声明 联合体的特点 相同成员的结构体和联合体对比 联合体大小的计算 联合的一个练习 联合体 联合体类型的声明 像结构体一样&#xff0c;联合体也是由…

闲聊电脑(4)硬盘分区

夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;上次你说的那个“分区”和“格式化”是什么意思&#xff1f; 冰箱&#xff1a;分区么&#xff0c;就是分…

Jasperreport 生成 PDF之省纸模式

省纸模式顾名思义就是节省纸张&#xff0c;使用 Jasper 去生成 PDF 的时候如果进行分组打印的时候&#xff0c;一页 A4 纸只会打印一组数据。这种情况下&#xff0c;如果每组数据特别少&#xff0c;只有几行&#xff0c;一页 A4 纸张根本用不了&#xff0c;就会另起一页继续打印…

elementui中的tree自定义图标

需求&#xff1a;实现如下样式的树形列表 自定义树的图标以及点击时&#xff0c;可以根据子级的关闭&#xff0c;切换图标 <el-tree :data"treeList" :props"defaultProps"><template #default"{ node, data }"><span class&quo…

linux中vim的操作

(码字不易&#xff0c;关注一下吧w~~w) 命令模式&#xff1a; 当我们按下esc键时&#xff0c;我们会进入命令模式&#xff1b;当使用vi打开一个文件时也是进入命令模式。 光标移动&#xff1a; 1 保存退出&#xff1a;ZZ 2 代码格式化&#xff1a;ggG 3 光标移动&#xff…

谁懂啊!性能测试还能这么快学好。。。。。。

前言 互联网普及&#xff0c;用户群体庞大&#xff0c;用户体验非常重要。性能是一种指标&#xff0c;是软件系统对于及时性的符合程度。对于一个产品根据响应时间和吞吐量衡量性能的及时性&#xff0c;响应时间是一个http完整的请求流程时间之和。对用户而言&#xff0c;响应…

【开源】基于Qt5的ROS1/ROS2人机交互软件(支持地图编辑/多点导航)

本项目基于Qt5开发&#xff0c;基于CMake进行构建&#xff0c;可以实现一套代码同时在ROS1/ROS2系统中使用(本项目已接入CI,保证多ROS版本/系统版本可用性) 项目地址&#xff1a; https://github.com/chengyangkj/Ros_Qt5_Gui_App 软件在编译时会自动识别环境变量中的ROS1/ROS…

Redis -- list列表

只有克服了情感的波动&#xff0c;才能专心致志地追求事业的成功 目录 列表 list命令 lpush lpushx rpush rpushx lrange lpop rpop lindex linsert llen lrem ltrim 阻塞命令 小结 列表 列表相当于 数组或者顺序表。 列表类型是用来存储多个有序的字符串&…

C语言探索:水仙花数的奥秘与计算

摘要&#xff1a; 水仙花数&#xff0c;一种特殊的三位数&#xff0c;其各位数字的立方和等于该数本身。本文将详细介绍水仙花数的定义、性质&#xff0c;以及如何使用C语言来寻找100至999范围内的水仙花数。 目录 一、水仙花数的定义与性质 二、用C语言寻找100至999范围内的…