环境准备:三台服务器 (建议使用4c4g,2c2g也可以使用,但是相对较慢)
|--------|-----------------|------------|--------|---|---|---|
| 角色     | IP地址            | 主机名        | k8s版本  | docker版本 |||
| master | 192.168.100.131 | k8s-master | 1.20.0 | 26.0.0  |||
| node01 | 192.168.100.132 | k8s-node01 | 1.20.0 | 26.0.0  |||
| node02 | 192.168.100.133 | k8s-node02 | 1.20.0 | 26.0.0  |||
前提部署:(所有主机均操作)
1、关闭防火墙
2、配置IP地址
3、配置yum仓库(本地源、base网络源、epel网络源、docker-ce源、kubernetes源)
            
            
              bash
              
              
            
          
          本地源:(配置步骤省略)
base网络源:
[root@k8s-master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
epel网络源:
[root@k8s-master ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
docker-ce源:
[root@k8s-master ~]# yum install -y yum-utils
[root@k8s-master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
kubernetes源:
[root@k8s-master ~]# vim   /etc/yum.repos.d/kubernetes.repo
配置如下:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg######################图片不代表操作、操作步骤上述已写########################
docker源也从阿里下载

kubernetes源从阿里源下载:



4、时间同步(测试环境时间一致可以省略)
生产环境部署:
1)(无网络)同步本地服务器:(centos7.9系统)
            
            
              bash
              
              
            
          
          [root@k8s-master ~]# yum   -y  install ntp
[root@k8s-master ~]#  vi /etc/ntp.conf
 配置如下:
 #启用 restrict限定该机器网段,192.168.229.111为当前节点的IP地址
restrict 192.168.100.131 mask 255.255.255.0 nomodify notrap
#注释掉 server 域名配置
#server 0.centos.pool.ntp.org iburst#server 1.centos.pool.ntp.org iburst#server 2.centos.pool.ntp.org iburst#server 3.centos.pool.ntp.org iburst
#添加如下两行配置,让本机和本地硬件时间同步
server 127.127.1.0
fudge 127.127.1.0 stratum 10
[root@k8s-master ~]# chkconfig ntpd on 2)(有网络)同步云服务器:(rhel9.5系统)
            
            
              bash
              
              
            
          
          [root@k8s-master ~]# yum   -y  install chrony
[root@k8s-master ~]#  vim /etc/chrony.conf
 配置如下:
#改chrony配置文件(替换默认的centos)
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
server ntp4.aliyun.com iburst
#保存之后修改本地时间 datae + -s "改一个其他时间进行测试"
[root@k8s-master ~]# Systemctl restart chronyd    #重启服务 等待几秒
#执行date查看是否同步
[root@k8s-master ~]# date
 
#allow 192.168.0.0/16 #允许NTP客户同步ip段  NTP同步时需要配置 
#iburst:在初始同步时,它允许chrony发送更多的请求来更快地获得信息并进行准确度更高的同步。这可以加速#chrony与选定的NTP服务器同步,并提高时间同步的精确性和可靠性。3)查看时间类型
在master节点上输入date命令,可以查看到当前系统时间如下所示。
如果结果中系统时间为HKT(即香港时间) ,可以把时间改为CST (CST表示 中部标准时间 ,即上海时间)。
#修改时间类型
使用shanghai时间来覆盖当前的系统默认时间,具体操作如下所示。
**注意:**上述操作在集群各个节点都要执行,保证当前系统时间标准为上海时间。
[root@k8s-master ~]# cp /usr/share/zoneinfo/Shanghai /etc/localtime

5、关闭交换分区(下述操作,选择其一即可)
临时关闭:
[root@k8s-master ~]# swapoff -a
永久关闭:
[root@k8s-master ~]# vim /etc/fstab 
# /dev/mapper/centos-swap swap

6、修改主机名和本地hosts解析文件
            
            
              bash
              
              
            
          
          master:
[root@k8s-master ~]# hostnamectl  set-hostname   k8s-master
[root@k8s-master ~]# bash
[root@k8s-master ~]# vim   /etc/hosts
添加如下:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.131 k8s-master
192.168.100.132 k8s-node01
192.168.100.133 k8s-node02
node1:
[root@k8s-node01 ~]# hostnamectl  set-hostname   k8s-node01
[root@k8s-node01 ~]# bash
[root@k8s-node01 ~]# vim   /etc/hosts
添加如下:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.131 k8s-master
192.168.100.132 k8s-node01
192.168.100.133 k8s-node02
node2:
[root@k8s-node02 ~]# hostnamectl  set-hostname   k8s-node02
[root@k8s-node02 ~]# bash
[root@k8s-node02 ~]# vim   /etc/hosts
添加如下:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.131 k8s-master
192.168.100.132 k8s-node01
192.168.100.133 k8s-node02
7、加载内核模块
            
            
              bash
              
              
            
          
          [root@k8s-master ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@k8s-master ~]# vim /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@k8s-master ~]# modprobe br_netfilter
[root@k8s-master ~]# sysctl -p
8、安装docker、配置加速器
            
            
              bash
              
              
            
          
          [root@k8s-master ~]# yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
[root@k8s-master ~]# vim   /etc/docker/daemon.json
配置如下:
{
          "registry-mirrors": [
                  "https://gbdogr0a.mirror.aliyuncs.com",
                  "https://docker.1panel.live",
                  "https://hub.littlediary.cn",
                  "https://docker.kejilion.pro",
                  "https://docker.1ms.run",
                  "https://lispy.org",
                  "https://dockerpull.cn",
                  "https://docker.xuanyuan.me",
                  "https://proxy.1panel.live",
                  "https://docker.1panel.top",
                  "https://docker.1ms.run",
                  "https://docker.ketches.cn",
                  "https://docker.hpcloud.cloud",
                  "https://docker.1panel.live",
                  "http://mirrors.ustc.edu.cn",
                  "http://mirror.azure.cn",
                  "https://nrbewqda.mirror.aliyuncs.com",
                  "https://dmmxhzvq.mirror.aliyuncs.com"
          ]
}
#启动并设置开机重启cri-docker
[root@k8s-master ~]# systemctl daemom-reload
[root@k8s-master ~]# systemctl start  docker9、安装kubelet kubeadm kubectl
            
            
              bash
              
              
            
          
          [root@k8s-master ~]# yum -y install kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0
   
[root@k8s-master ~]# systemctl enable kubelet
 kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功。
    如果在命令执行过程中出现索引 gpg 检查失败的情况, 请使用 yum install -y --nogpgcheck kubelet kubeadm kubectl 来安装。

10、配置init-config.yaml
            
            
              bash
              
              
            
          
          [root@k8s-master ~]# kubeadm config print init-defaults > init-config.yaml
init-config.yaml配置
[root@k8s-master ~]# vim init-config.yaml 
配置如下:
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.100.131  //master节点IP地址
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master  //如果使用域名保证可以解析,或直接使用 IP 地址
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd  //etcd 容器挂载到本地的目录
imageRepository: registry.aliyuncs.com/google_containers //修改为国内地址
kind: ClusterConfiguration
kubernetesVersion: v1.19.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16  //新增加 Pod 网段
scheduler: {}

11、先拉取镜像,再初始化集群
            
            
              bash
              
              
            
          
          列出所需镜像
[root@k8s-master ~]# kubeadm config images list --config init-config.yaml
拉取
[root@k8s-master ~]# kubeadm config images pull --config=init-config.yaml
[root@k8s-master ~]# kubeadm init --config=init-config.yaml 
[root@k8s-master ~] # mkdir -p $HOME/.kube 
[root@k8s-master ~] # cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 
[root@k8s-master ~] # chown (id -u):(id -g) $HOME/.kube/config

12、node节点加入集群
[root@k8s-node01 ~]# kubeadm join 192.168.100.131:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:78bdd0f01660f4e84355b70aa8807cf1d0d6325b0b28502b29c241563e93b4ae

master节点查看集群节点状态(当前没有配置网络,所以是notready状态)
[root@k8s-master ~] # kubectl get nodes

拓展命令:(加入集群创建不成功,恢复操作如下)
            
            
              bash
              
              
            
          
          节点管理命令
以下命令无需执行,仅作为了解
重置master和node配置
[root@k8s-master ~]# kubeadm reset
删除node配置
[root@k8s-master ~]# kubectl delete node k8s-node01
 
[root@k8s-node01 ~]# docker rm -f $(docker ps -aq)
[root@k8s-node01 ~]# systemctl stop kubelet
[root@k8s-node01 ~]# rm -rf /etc/kubernetes/*
[root@k8s-node01 ~]# rm -rf /var/lib/kubelet/*13、配置网络(两种方式)
方式一:flannel网络
            
            
              bash
              
              
            
          
              Master 节点NotReady 的原因就是因为没有使用任何的网络插件,此时Node 和Master的连接还不正常。目前最流行的Kubernetes 网络插件有Flannel、Calico、Canal、Weave 这里选择使用flannel。
所有主机:(master、node01、node02)
master上传kube-flannel.yml,所有主机上传flannel_v0.12.0-amd64.tar
[root@k8s-master ~]# docker load < flannel_v0.12.0-amd64.tar
上传插件: 
[root@ k8s-master~] # tar xf cni-plugins-linux-amd64-v0.8.6.tgz 
[root@ k8s-master~] # cp flannel /opt/cni/bin/
master主机: 
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
[root@k8s-master ~]# kubectl get nodes 
[root@k8s-master ~]# kubectl get pods -n kube-system

已经是ready状态
方式二:Calico网络
下载对应的calico.yml文件 
官网: https://calico-v3-25.netlify.app/archive/v3.25/getting-started/kubernetes/quickstart
1、安装 Calico 网络插件
[root@k8s-master ~] # kubectl apply -f calico.yaml

2、查看node节点状态。 
[root@k8s-master ~]# kubectl get nodes
3、查看所有pod状态 
[root@k8s-master ~]# kubectl get pod --all-namespaces

4、查看所有system状态 
[root@k8s-master ~]# kubectl get pod -n kube-system

安装Dashboard UI
(一)部署Dashboard 
dashboard的github仓库地址:https://github.com/kubernetes/dashboard 代码仓库当中,有给出安装示例的相关部署文件,我们可以直接获取之后,直接部署即可
[root@k8s-master ~]# wget ++https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended.yaml++ 下载不下来的同学,使用我给的对应软件 默认这个部署文件当中,会单独创建一个名为kubernetes-dashboard的命名空间,并将kubernetes-dashboard部署在该命名空间下。dashboard的镜像来自docker hub官方,所以可不用修改镜像地址,直接从官方获取即可。
(二)开放端口设置 
在默认情况下,dashboard并不对外开放访问端口,这里简化操作,直接使用nodePort的方式将其端口暴露出来,``修改serivce部分的定义: 
所有主机下载镜像:(master、node01、node02) 
[root@k8s-master ~]# docker pull kubernetesui/dashboard:v2.0.0 
[root@k8s-master ~]# docker pull kubernetesui/metrics-scraper:v1.0.4

            
            
              bash
              
              
            
          
          [root@k8s-master ~]# vim recommended.yaml
30 ---
 31 
 32 kind: Service
 33 apiVersion: v1
 34 metadata:
 35   labels:
 36     k8s-app: kubernetes-dashboard
 37   name: kubernetes-dashboard
 38   namespace: kubernetes-dashboard
 39 spec:
 40   type: NodePort
 41   ports:
 42     - port: 443
 43       targetPort: 8443
 44       nodePort: 32443
 45   selector:
 46     k8s-app: kubernetes-dashboard
 47 
 48 ---
 
192           image: kubernetesui/dashboard:v2.0.0
276           image: kubernetesui/metrics-scraper:v1.0.4(三)权限配置 
配置一个超级管理员权限 
            
            
              bash
              
              
            
          
          (三)权限配置
配置一个超级管理员权限
[root@k8s-master ~]# vim recommended.yaml 
155 ---
156 
157 apiVersion: rbac.authorization.k8s.io/v1
158 kind: ClusterRoleBinding
159 metadata:
160   name: kubernetes-dashboard
161 roleRef:
162   apiGroup: rbac.authorization.k8s.io
163   kind: ClusterRole
164   name: cluster-admin
165 subjects:
166   - kind: ServiceAccount
167     name: kubernetes-dashboard
168     namespace: kubernetes-dashboard
169 
170 ---[root@k8s-master ~]# kubectl apply -f recommended.yaml

[root@k8s-master ~]# kubectl get pods -n kubernetes-dashboard
[root@k8s-master ~]# kubectl get pods -A -o wide

(四)访问Token配置
使用谷歌浏览器测试访问 https://192.168.100.131:32443


可以看到出现如上图画面,需要我们输入一个kubeconfig文件或者一个token。
事实上在安装dashboard时,也为我们默认创建好了一个serviceaccount,为kubernetes-dashboard,并为其生成好了token, 我们可以
通过如下指令获取该sa的token: 
[root@k8s-master ~]# kubectl describe secret -n kubernetes-dashboard $(kubectl get secret -n kubernetes-dashboard |grep kubernetes-dashboard-token | awk '{print $1}') |grep token | awk '{print $2}'







安装metrics-server
1、在Node节点上下载镜像
heapster已经被metrics-server取代 
[root@k8s-node01 ~]# docker pull bluersw/metrics-server-amd64:v0.3.6 
[root@k8s-node01 ~]# docker tag bluersw/metrics-server-amd64:v0.3.6 k8s.gcr.io/metrics-server-amd64:v0.3.6 

2、修改 Kubernetes apiserver 启动参数
在kube-apiserver项中添加如下配置选项 
修改后apiserver会自动重启 
[root@k8s-master ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml 
42 - --enable-aggregator-routing= true

3、 Master 上进行部署
[root@k8s-master ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml

修改安装脚本:
            
            
              bash
              
              
            
          
          [root@k8s-master ~]# vim components.yaml
 73   template:
 74     metadata:
 75       name: metrics-server
 76       labels:
 77         k8s-app: metrics-server
 78     spec:
 79       serviceAccountName: metrics-server
 80       volumes:
 81       # mount in tmp so we can safely use from-scratch images and/or read-only containers
 82       - name: tmp-dir
 83         emptyDir: {}
 84       containers:
 85       - name: metrics-server
 86         image: k8s.gcr.io/metrics-server-amd64:v0.3.6
 87         imagePullPolicy: IfNotPresent
 88         args:
 89           - --cert-dir=/tmp
 90           - --secure-port=4443
 91           - --kubelet-preferred-address-types=InternalIP
 92           - --kubelet-insecure-tls
[root@k8s-master ~]# kubectl create -f components.yaml

等待1-2分钟后查看结果
[root@k8s-master ~]# kubectl get pods -A -o wide
[root@k8s-master ~]# kubectl top nodes
效果偏慢!耗时长

若出不来,排查思路
[root@k8s-master ~]# kubectl get --raw "/apis/metrics.k8s.io/v1beta1"
Error from server (ServiceUnavailable): the server is currently unable to handle the request
[root@k8s-master ~]# kubectl get apiservice | grep metrics.k8s.io
v1beta1.metrics.k8s.io kube-system/metrics-server False (MissingEndpoints) 8m12s
[root@k8s-master ~]# kubectl describe apiservice v1beta1.metrics.k8s.io
Name: v1beta1.metrics.k8s.io
Namespace:
Labels: <none>
Annotations: <none>
API Version: apiregistration.k8s.io/v1
Kind: APIService
Metadata:
Creation Timestamp: 2024-04-06T06:29:54Z
Resource Version: 2377
UID : 58cbf0c5-82ab-4515-8cce-8aa74ed2cdb6
Spec :
Group: metrics.k8s.io
Group Priority Minimum: 100
Insecure Skip TLS Verify: true
Service:
Name: metrics-server
Namespace: kube-system
Port: 443
Version: v1beta1
Version Priority: 100
Status:
Conditions:
Last Transition Time: 2024-04-06T06:29:55Z
Message: endpoints for service/metrics-server in "kube-system" have no addresses with port name ""
Reason: MissingEndpoints
Status: False
Type: Available
Events: <none>
[root@k8s-master ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
检查 ip 地址和 端口 ,没有问题,则等着即可!

再回到dashboard界面可以看到CPU和内存使用情况了

到此K8S集群安装全部完成!!!