目录

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。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐