Kubeadm快速部署k8s集群----1.20.0版本(基于centos7.9,因为k8s版本为1.24之下,所以可以直接使用docker)

环境准备:三台服务器建议使用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  docker

9、安装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集群安装全部完成!!!

相关推荐
维尔切7 小时前
k8s 实战入门
云原生·容器·kubernetes
xx.ii7 小时前
K8s练习
云原生·容器·kubernetes
算是难了7 小时前
K8s基础总结
云原生·容器·kubernetes
失因7 小时前
Kubernetes(K8s)资源管理
云原生·容器·kubernetes
xuhe29 小时前
🛠️ 深度解析我的 Overleaf 私有化部署:一份稳定、高兼容性的 `docker-compose.yaml`
linux·docker·科研·overleaf
白小云<10 小时前
docker镜像
docker·容器·eureka
何故染尘優10 小时前
docker学习笔记,从入门开始!
笔记·学习·docker
不爱笑的良田11 小时前
从零开始的云原生之旅(一):把 Go 应用塞进 Docker
docker·云原生·golang
不爱笑的良田11 小时前
从零开始的云原生之旅(四):K8s 工作负载完全指南
云原生·容器·kubernetes