小工具知识网

当前位置: 首页 > 行业知识 > K8S简介和安装部署详细教程

行业知识

K8S简介和安装部署详细教程

2026-11-11 15:43:43 来源:互联网转载

目录

一、K8S简介

Kubernetes集群组件逻辑图

Master节点组件及功能

Slave节点组件及功能

          安装部署

二进制包

kubeadm工具

二、准备工作

软硬件要求

集群规划

环境配置

修改hosts配置

配置SSH免密登录

关闭Swap分区

禁用SELinux

关闭防火墙

修改内核参数

配置集群时钟同步

配置k8s的Yum源

三、安装Docker

四、安装K8S集群

安装三大组件-kubeadm、kubelet、kubectl

初始化k8s集群

加入节点

安装网络插件

五、测试K8S集群

创建nginx pod

对外暴露访问

访问nginx

六、安装Dashboard

通过kubectl命令安装

创建访问账号

获取token

登录界面


一、K8S简介

Kubernetes中文官网:Kubernetes

GitHub:github.com/kubernetes/kubernetes

Kubernetes简称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,起源于Google 集群管理工具Borg。

Kubernetes集群组件逻辑图

k8s集群属于Master-Slave主从架构,Master节点负责集群管理和资源调度,用于运行控制平面组件(Control Plane Components),Slave节点就是工作负载节点,一般称为Node节点,也叫Worker节点,主要负责运行Pod,一个Pod里可以同时运行多个容器,而容器一般封装的就是基于Dokcer打包的应用,Pod英文叫豌豆荚,每个容器就像是一颗豌豆,简单来说Pod就是一组容器。

Master节点组件及功能

Master组件
组件名称功能用途
kube-apiserver负责处理接受请求。
etcd高可用键值存储,用于k8s集群的后台数据库。
kube-scheduler负责选择Worker节点运行新创建的Pod,需要考虑的因素包括资源需求,软硬件及策略约束,亲和性和反亲和性规范、数据位置等。

kube-controller-manager

负责运行不同类型的控制器进程,每个控制器都是一个单独进程,常见的控制器有节点控制器(Node Controller)、任务控制器(Job Controller)、端点分片控制器(EndpointSlice controller)、服务账号控制器(ServiceAccount controller)等。

cloud-controller-manager

用于嵌入特定的云平台的控制器。

Slave节点组件及功能

Slave组件
组件名称功能用途

kubelet

负责管理Node节点上容器的健康运行,通过接收一组PodSpecs来实现,每个Node节点上都会运行一个kubelet,不会管理不是由 Kubernetes 创建的容器。

kube-proxy

负责Node节点上的网络代理,用于维护网络规则,这些规则允许从集群内部或外部与Pod进行网络通信,每个Node节点上都会运行一个kube-proxy,k8s的Service就是利用该组件实现的。

Container Runtime

负责管理容器的执行和生命周期。支持多种类型的容器运行时环境,比如

containerd、 CRI-O及CRI自定义实现,k8s使用容器运行时接口(CRI)和用户选择的容器运行时交互。

安装部署

生产环境部署k8s主要有两种方式:

二进制包

Github下载稳定版的二进制包,手动部署每个组件组成k8s集群。

kubeadm工具

使用Kubeadm工具可以快速搭建一个k8s集群,主要包括初始化控制平面节点和加入Worker节点,提供的主要功能如下:

  • kubeadm init:初始化一个Master节点
  • kubeadm join:将Worker节点加入集群
  • kubeadm upgrade:升级K8s版本
  • kubeadm token:管理 kubeadm join 使用的令牌
  • kubeadm reset:清空 kubeadm init 或者 kubeadm join 对主机所做的任何更改
  • kubeadm version:打印 kubeadm 版本
  • kubeadm alpha:预览可用的新功能

    二、准备工作

    软硬件要求

    • Linux操作系统,Ubuntu 或 CentOS
    • 每台节点至少2G
    • Master节点至少2C
    • 集群节点网络互通

      集群规划

      软件环境
      操作系统

      CentOS Linux release 7.9.2009 x86_64

      Dockerv24.0.6
      k8sv1.20.9
      kubeadmv1.20

      节点配置
      主机角色IPCPU内存
      node1Master

      192.168.5.10

      16C40G
      node2Node

      192.168.5.11

      16C40G
      node3Node

      192.168.5.12

      16C40G

      环境配置

      修改hosts配置

      配置所有节点的IP和域名映射

      # vim /etc/hosts192.168.5.10 node1192.168.5.11 node2192.168.5.12 node3

      配置SSH免密登录

      先生成公钥对,再把公钥远程复制到所有节点。

      [root@node1 ~]# ssh-keygen[root@node1 ~]# ssh-copy-id node1[root@node1 ~]# ssh-copy-id node2[root@node1 ~]# ssh-copy-id node3[root@node1 ~]# ssh node2Last login: Mon Oct  2 17:18:39 2023 from 192.168.5.117

      关闭Swap分区

      kubelet要求必须禁用交换分区,所以kubeadm初始化时回检测swap是否关闭,如果没有关闭会报错,如果不想关闭安装时命令行可以指定-ignore-preflight-errors=Swap,关闭Swap分区在所有节点上执行如下命令:

      # 临时关闭,重启恢复[root@node1 ~]# swapoff -a# 永久关闭echo vm.swappiness = 0 >> /etc/sysctl.conf[root@node1 ~]# sysctl -p[root@node1 ~]# cat /etc/fstab/dev/mapper/centos-swap swap                    swap    defaults        0 0

      禁用SELinux

      所有节点执行如下命令:

      [root@node1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux

      关闭防火墙

      所有节点执行如下命令:

      [root@node1 ~]# systemctl disable firewalld[root@node1 ~]# systemctl stop firewalld

      修改内核参数

      [root@node1 ~]# modprobe br_netfilter[root@node1 ~]# echo "modprobe br_netfilter" >> /etc/profile[root@node1 ~]# tee /etc/sysctl.d/k8s.conf > /etc/hosts# 只在主节点执行kubeadm init \--apiserver-advertise-address=192.168.5.10 \--control-plane-endpoint=cluster-endpoint \--image-repository  registry.cn-hangzhou.aliyuncs.com/google_containers \--kubernetes-version v1.20.9 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=172.20.0.0/16

      初始化需要下载多个镜像,可能时间比较久,最终安装的镜像如下:

      [root@node1 ~]# docker imagesREPOSITORY                     TAG        IMAGE ID       CREATED         SIZEregistry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy                v1.20.9    8dbf9a6aa186   2 years ago     99.7MBregistry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager   v1.20.9    eb07fd4ad3b4   2 years ago     116MBregistry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver            v1.20.9    0d0d57e4f64c   2 years ago     122MBregistry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler            v1.20.9    295014c114b3   2 years ago     47.3MBregistry.cn-hangzhou.aliyuncs.com/google_containers/etcd                      3.4.13-0   0369cf4303ff   3 years ago     253MBregistry.cn-hangzhou.aliyuncs.com/google_containers/coredns                   1.7.0      bfe3a36ebd25   3 years ago     45.2MBregistry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.2        80d28bedfe5d   3 years ago     683kB

      成功界面:

      Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:  mkdir -p $HOME/.kube  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config  sudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:  export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:  https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.5.10:6443 --token kdy4ka.jz5otwd1l3l2of5v \    --discovery-token-ca-cert-hash sha256:d40fe1c0af2bef8143106d27d418a4b7026f1f79a6dfe30cb4691d35755719ad

      要使非root用户运行kubectl,请执行以下命令,这也是上面kubeadm init输出的一部分: 

      mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config

       如果是root用户,则可以执行以下命令:

      export KUBECONFIG=/etc/kubernetes/admin.conf

      记住上面输出的kubeadm join命令,下面用该命令将节点加入集群。

      加入节点

      所有Node节点执行如下命令: 

      kubeadm join 192.168.5.10:6443 --token kdy4ka.jz5otwd1l3l2of5v \    --discovery-token-ca-cert-hash sha256:d40fe1c0af2bef8143106d27d418a4b7026f1f79a6dfe30cb4691d35755719ad

      查看token列表,可观察到每个token的剩余有效时间

      [root@node1 ~]# kubeadm token listTOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION EXTRA GROUPSkdy4ka.jz5otwd1l3l2of5v   7h          2023-10-03T19:46:32+08:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token

      默认token有效期为24小时,过期之后token失效,可重新生成token:

      kubeadm token create --print-join-command

      修改角色:

      # node节点执行[root@node1 ~]# kubectl label node node2 node-role.kubernetes.io/worker=worker# master节点执行[root@node1 ~]# kubectl get nodesNAME    STATUS   ROLES                  AGE   VERSIONnode1   Ready    control-plane,master   16h   v1.20.9node2   Ready    worker                 15h   v1.20.9node3   Ready    worker                 15h   v1.20.9

      安装网络插件

      Calico是一套开源的纯三层的虚拟化网络解决方案,是目前K8s主流的网络方案。它把每个节点都作为一个虚拟路由器,把Pod当做路由器上一个终端设备为其分配一个IP地址,通过BGP协议生成路由规则,实现不同节点上的Pod网络互通。

      # 下载calico.yaml并保存到本地[root@node1 ~]# curl https://docs.projectcalico.org/v3.15/manifests/calico.yaml -O修改配置3888行             - name: CALICO_IPV4POOL_CIDR3889行               value: "172.20.0.0/16"# 提交[root@node1 ~]# kubectl apply -f calico.yaml# 验证是否成功[root@node1 ~]# kubectl get pod -A | grep calicokube-system            calico-kube-controllers-577f77cb5c-s6zfl     1/1     Running   0          15hkube-system            calico-node-7gsfr                            1/1     Running   0          15hkube-system            calico-node-hb2k8                            1/1     Running   0          15hkube-system            calico-node-xt4bl                            1/1     Running   0          15h

      五、测试K8S集群

      创建nginx pod

      默认会在默认命名空间default中创建一个名称为mynignx的deployment,同时会创建一个名称以myniginx为前缀,叫mynginx-5b686ccd46-wshz6的Pod。

      [root@node1 ~]# kubectl create deployment mynginx --image=nginxdeployment.apps/mynginx created# 查看pod[root@node1 ~]# kubectl get pod,svcNAME                           READY   STATUS    RESTARTS   AGEpod/mynginx-5b686ccd46-wshz6   1/1     Running   0          39sNAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGEservice/kubernetes   ClusterIP   10.96.0.1            443/TCP   17h

      对外暴露访问

      基于第一步创建的deployment再创建一个名叫mynginx的Service,资源类型由--type=ClusterIP修改为--type=NodePort,会在每个Node节点上监听30161端口,用于接收集群外部访问。

      [root@node1 ~]# kubectl expose deployment mynginx --port=80 --type=NodePortservice/mynginx exposed# 查看[root@node1 ~]# kubectl get pod,svcNAME                           READY   STATUS    RESTARTS   AGEpod/mynginx-5b686ccd46-wshz6   1/1     Running   0          5m24sNAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGEservice/kubernetes   ClusterIP   10.96.0.1              443/TCP        17hservice/mynginx      NodePort    10.105.55.49           80:30161/TCP   50s

      访问nginx

      浏览器输入:,都可以访问nginx首页表示测试成功。

      六、安装Dashboard

       k8s官方提供了一个简单的Dashboard,主要提供工作负载,服务,配置和存储,集群等管理功能。

      Github:github.com/kubernetes/dashboard

      通过kubectl命令安装

      kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

      对外暴露访问端口,由--type=ClusterIP修改为--type=NodePort

      kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

      查看service

      [root@node1 ~]# kubectl get svc -A|grep dashboardkubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.102.247.36           8000/TCP                 16hkubernetes-dashboard   kubernetes-dashboard        NodePort    10.96.38.129            443:31128/TCP            16h

      浏览器输入访问地址:https://192.168.5.10:31128/,需要token才能访问。

      创建访问账号

      [root@node1 ~]# vim dashboard-token.yamlapiVersion: v1kind: ServiceAccountmetadata:  name: admin-user  namespace: kubernetes-dashboard---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata:  name: admin-userroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-adminsubjects:- kind: ServiceAccount  name: admin-user  namespace: kubernetes-dashboard[root@node1 ~]# kubectl apply -f dashboard-token.yamlserviceaccount/admin-user created

      获取token

      [root@node1 ~]# kubectl get secret -n kubernetes-dashboardNAME                               TYPE                                  DATA   AGEadmin-user-token-vfj8s             kubernetes.io/service-account-token   3      10sdefault-token-w8jgn                kubernetes.io/service-account-token   3      15mkubernetes-dashboard-certs         Opaque                                0      15mkubernetes-dashboard-csrf          Opaque                                1      15mkubernetes-dashboard-key-holder    Opaque                                2      15mkubernetes-dashboard-token-xjt6l   kubernetes.io/service-account-token   3      15m# 查看名为admin-user-token-vfj8s的secret[root@node1 ~]# kubectl describe secret admin-user-token-vfj8s -n kubernetes-dashboardName:         admin-user-token-vfj8sNamespace:    kubernetes-dashboardLabels:       Annotations:  kubernetes.io/service-account.name: admin-user              kubernetes.io/service-account.uid: 36b4e5f5-2f46-488d-960c-899cb4309d50Type:  kubernetes.io/service-account-tokenData====ca.crt:     1066 bytesnamespace:  20 bytestoken:      eyJhbGciOiJSUzI1NiIsImtpZCI6IkhMMXFCMGVaVHVrV0hHampTRExxdHlMcjBvTVlXRHd0Vl9hc29lSXU0TG8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXZmajhzIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzNmI0ZTVmNS0yZjQ2LTQ4OGQtOTYwYy04OTljYjQzMDlkNTAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.ZoE_jz20Jf3ImLl9BwTmk5VM7Y_VacRI3ZaTbaD8ipdsDV7CCBjE9edrVtQ-L86HOU0Qb_SA3HHqO0wtGagfAVHahHJaNLcr-MAOURWmIyLg8A2K07OT_5Qr9BJC-xxFym25sOc04Cyj-Z86-LsECSbIKLhUwsxXSzAQKuPmD471MMO-_JL-FWAJ-3jdZ8E4uAMD-mhJrKyORqMgoRxPJXPgwkzd2PRPrHoiaunbxiGo6qWhONGiMITjfCW77or32TbPIDuxy94j64tWvJyVDbmyGq1J0WeOzjfobdnbyM6BRGdjP86F_P-DyTXWSfOJHbAVYcgpDcqYO_DImtg8_g

      登录界面

      输入上面的token,进入dashboard首页

上一篇:揭秘by后缀的魅力,正确使用指南助你吸引目光!

下一篇:怎么与服务器连接蓝牙耳机?