Kubernetes入门一:介绍及环境准备

Kubernetes学习笔记

本节主要介绍:

  • Kubernetes的一些基础知识
  • Kubernetes集群搭建的相关操作内容

前言

1. 部署的演变过程:

整个部署的演变过程如图所示:

在这里插入图片描述

  • 传统部署时代:

    • 在物理机服务器上运行应用程序
    • 无法为应用程序定义资源边界
    • 导致资源分配问题

    如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况下,会导致其它应用程序的性能下降。一种解决方案就是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且维护许多物理服务器的成本也很高。

  • 虚拟化部署

    • 虚拟化技术允许在单个物理服务器的 CPU 上运行多个虚拟机
    • 虚拟化允许应用程序在虚拟机之间隔离,并提供一定程序上的安全,应用程序之间不会被随意访问
    • 虚拟化技术能够更好的利用物理服务器上的资源
    • 每个虚拟机都是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括自己的操作系统等

    缺点:每台虚拟机都有各自的操作系统等,虚拟层冗余,导致资源浪费和性能下降。

  • 容器化部署

    • 容器类似于虚拟机 ,但是可以在应用程序之间共享操作系统 (操作系统只有一份,各个程序之间共享)
    • 容器和虚拟机类似,具有自己的文件系统、CPU 、内存、进程空间等
    • 由于容器和基础架构分离,因为可以很方便的进行跨云和跨 Linux 发行版进行移植、

1、kubernetes介绍

1.1 概述

kubernetes (k8s)是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。

Kubernetes 为我们提供下面的功能:

  • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
  • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
  • 存储编排:可以根据容器自身的需求自动创建存储卷
    在这里插入图片描述

1.2 kubernetes组件

一个kubernetes集群主要是由控制节点(master)、**工作节点(node)**构成,每个节点上都会安装不同的组件。

在这里插入图片描述

master:集群的控制平面,负责集群的决策 ( 管理 )

ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制

Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等

Etcd :负责存储集群中各种资源对象的信息

node:集群的数据平面,负责为容器提供运行环境 ( 干活 )

Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器

KubeProxy : 负责提供集群内部的服务发现和负载均衡

pod:Pod 是对容器的再一次封装,一个pod可以包含多个container

  • docker run 启动的是一个 container(容器),容器是 Docker 的基本单位,一个应用就是一个容器
  • kubectl run 启动的是一个应用称为一个 Pod ,Pod 是 Kubernetes 的基本单位。

Docker : 负责节点上容器的各种操作

下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:

  1. 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中

  2. 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件

  3. apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上

    在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer

  4. apiServer调用controller-manager去调度Node节点安装nginx服务

  5. kubelet接收到指令后,会通知docker,然后由docker来启动一个nginxpod

    podkubernetes最小操作单元,容器必须跑在pod中至此,

  6. 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理

这样,外界用户就可以访问集群中的nginx服务了

1.3 kubernetes名词解释

  • Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控

  • Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行

  • Podkubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器

  • Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等

  • Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod

  • Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签

  • NameSpace:命名空间,用来隔离pod的运行环境

2、集群环境搭建

2.1 整体介绍

1. 集群类型:

kubernetes集群大体上可以分为两类:

  • **一主多从:**一台master节点和多台node节点,该方式搭建简单,一旦主机master出现故障异常,整个集群会宕机,较为适用于测试环境。
  • 多主多从: 多台master节点和多台node节点,该方式搭建较为复杂,但是具有较高的安全性,一旦一个master节点出现故障,其他master可以立马顶上去,保证集群正常运转,多用于生产环境。
    在这里插入图片描述

2. 搭建方式

Kubernetes 有多种部署方式,目前主流的方式有 kubeadm 、minikube 、二进制包。

  • minikube:一个用于快速搭建单节点的 Kubernetes 工具。

  • kubeadm:一个用于快速搭建Kubernetes 集群的工具(可以用于生产环境)。

  • 二进制包:从官网上下载每个组件的二进制包,依次去安装(建议生产环境使用)。

kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:

  • 创建一个Master 节点kubeadm init
  • 将Node 节点加入到当前集群中$ kubeadm join <Master 节点的IP 和端口>

本次搭建 采用kubeadm的方式进行

3. 主机规划

角色 IP地址 操作系统 配置
master 192.168.79.100 CentOS7.9 + 基础设施服务器 2核2G 20G
node1 192.168.79.101 CentOS7.9 + 基础设施服务器 2核2G 20G
node2 192.168.79.102 CentOS7.9 + 基础设施服务器 2核2G 20G

本次集群搭建:3台CentOS服务器,一个master,两个node(一主二从)CentOS 7.9 基础设施服务器

每台服务器安装docker(18.06.3);kubeadm(1.17.4); kubelet (1.17.4); kubectl (1.17.4)

  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap 分区

2.2、VM Ware安装CentOS 7

VMWare安装CentOS7并配置IP地址步骤:

  1. 首先下载并安装好VM软件以及CentOS7版本的镜像:下载地址:

软件下载地址:

CentOS7 阿里云下载地址: 点我下载CentOS7镜像

VM Ware:云盘链接:云盘下载链接 提取码:5lgm

  1. 通过VM软件分别安装3台CentOS服务器,一台为master,两台为Node。以其中一台为例,具体安装过程见另一篇文章:

    CentOS7安装详细过程

    点我查看CentOS7详细安装过程

2.3 环境初始化

三台CentOS服务器安装完毕之后 如图所示,可以通过MobaXterm软件进行连接,可以同时操作三台机器。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 查看CentOS安装版本,确保为CentOS7以上

    # 此方式安装k8s集群要求CentOS 版本必须在7.5以之上,本次使用7.9版本
    [root@master ~]# cat /etc/centos-release
    CentOS Linux release 7.9.2009 (Core)
    [root@master ~]#
    
  2. 主机域名解析

    方便后面集群节点之间的直接调用访问,配置一下主机域名解析

    #编辑三台服务器的/etc/hosts文件,在里面添加如下内容:
    192.168.79.100 master
    192.168.79.101 node1
    192.168.79.102 node2
    
  3. 时间同步

    k8s要求集群中的节点时间必须精确一直,使用chronyd服务从网络同步时间

    # 启动chronyd服务
    [root@master ~]# systemctl start chronyd
    # 将其设置为开机自启动
    [root@master ~]# systemctl enable chronyd
    # 查看当前三台机器的时间(只展示其中master一台)
    [root@master ~]# date
    2022年 07月 01日 星期五 13:04:36 CST
    
  4. 禁用iptables和firewalld服务

    k8s和docker会在运行中产生大量的iptables规则,为了不和系统规则混淆,直接关闭系统的规则

    # 关闭firewalld
    [root@master ~]# systemctl stop firewalld
    # 设置为开启禁止自启
    [root@master ~]# systemctl disable firewalld
    Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    # 关闭iptables (本机器没有iptales)
    [root@master ~]# systemctl stop iptables
    Failed to stop iptables.service: Unit iptables.service not loaded.
    
  5. 禁用selinux

    selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群时会产生各种各样的问题。

    # 编辑注册表/etc/selinux/config文件,修改SELINUX的值为disabled 修改完之后需要重启Linux服务才能生效
    
    # 当前为开启状态
    [root@master ~]# getenforce
    Enforcing
    # 
    [root@master ~]# vim /etc/selinux/config
    # 进入该文件进行修改
    

在这里插入图片描述

  1. 禁用swap分区

    swap分区是虚拟内存分区,在物理内存使用完毕之后,将磁盘空间虚拟成内存来使用。启动swap设备会对系统性能产生影响,因此直接禁用swap分区

    # 编辑分区的配置文件/etc/fstab 注释掉swap分区这一行内容,修改之后需要重启服务
    [root@master ~]# vim /etc/fstab
    

在这里插入图片描述

  1. 修改Linux内核参数

    #修改Linux的内核参数,添加网桥过滤和地址转发功能
    # 编辑(新建)/etc/sysctl.d/kubernetes.conf文件,添加如下配置
    net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-ip6tables=1
    net.ipv4.ip_forward=1
    
    # 保存退出之后重新加载配置
    [root@master ~]# sysctl -p
    
    # 加载网桥过滤模块
    [root@master ~]# modprobe br_netfilter
    
    # 查看该模块是否加载成功
    [root@master ~]# lsmod | grep br_netfilter
    br_netfilter           22256  0
    bridge                151336  1 br_netfilter
    

    在这里插入图片描述

  2. 配置ipvs功能

    k8sservice有两种代理模式,一种是基于iptables的,一种是基于ipvs的,两者比较来说,ipvs的性能较高一些,使用该模式,需要手动载入ipvs模块

    # 1.安装ipset和ipvsadm
    [root@master ~]# yum install ipset ipvsadmin -y
    已加载插件:fastestmirror, langpacks
    Determining fastest mirrors
     * base: mirrors.aliyun.com
     * extras: mirrors.aliyun.com
     * updates: mirrors.aliyun.com
    base                                                                    | 3.6 kB  00:00:00
    extras                                                                  | 2.9 kB  00:00:00
    updates                                                                 | 2.9 kB  00:00:00
    (1/4): base/7/x86_64/primary_db                                         | 6.1 MB  00:00:00
    (2/4): base/7/x86_64/group_gz                                           | 153 kB  00:00:00
    (3/4): extras/7/x86_64/primary_db                                       | 247 kB  00:00:00
    (4/4): updates/7/x86_64/primary_db                                      |  16 MB  00:00:18
    软件包 ipset-7.1-1.el7.x86_64 已安装并且是最新版本
    没有可用软件包 ipvsadmin。
    无须任何处理
    
    # 2.添加需要加载的模块写入脚本文件
    [root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules
    > #!/bin/bash
    > modprobe -- ip_vs
    > modprobe -- ip_vs_rr
    > modprobe -- ip_vs_wrr
    > modprobe -- ip_vs_sh
    > modprobe -- nf_conntrack_ipv4
    > EOF
    
    # 3. 为脚本文件添加执行权限
    [root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
    
    # 4. 执行脚本文件
    [root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
    
    # 5. 查看对应模块是否加载成功
    [root@node2 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    nf_conntrack_ipv4      15053  0
    nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
    ip_vs_sh               12688  0
    ip_vs_wrr              12697  0
    ip_vs_rr               12600  0
    ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
    nf_conntrack          139264  2 ip_vs,nf_conntrack_ipv4
    libcrc32c              12644  3 xfs,ip_vs,nf_conntrack
    [root@master ~]#
    
  3. 重启服务器

    [root@master ~]# reboot
    
  4. 重启服务后 查看selinux是否关闭成功

    # 显示Disabled 关闭成功
    [root@master ~]# getenforce
    Disabled
    
    

2.4 安装docker

  1. docker的官方镜像源速度较慢,切换为阿里云的镜像源

    # 切换为阿里云的镜像源
    [root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
    
  2. 查看当前镜像源中支持的docker版本

    # 支持的docker版本,本次选择 docker-ce-18.06.3.ce-3.el7
    [root@master ~]# yum list docker-ce --showduplicates
    [root@master ~]#
    
    

在这里插入图片描述

  1. 安装指定版本的docker-ce

    # --setopt=obsoletes=0 表示指定安装对应版本
    [root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
    
  2. 添加一个配置文件

    # Docker 默认情况下使用Cgroupfs,而k8s推荐使用systemd来替代cgroupfs, 更换下载的镜像源
    [root@master ~]# mkdir /etc/docker
    
    [root@master ~]# cat <<EOF> /etc/docker/daemon.json
    {
          
          
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]
    }
    EOF
    
  3. 启动docker

    # 启动docker
    [root@master ~]# systemctl restart docker
    # 设置为开机自启
    [root@master ~]# systemctl enable docker
    
  4. 检查docker的状态和版本信息

    #检查版本信息
    [root@master ~]# docker version
    Client:
     Version:           18.06.3-ce
     API version:       1.38
     Go version:        go1.10.3
     Git commit:        d7080c1
     Built:             Wed Feb 20 02:26:51 2019
     OS/Arch:           linux/amd64
     Experimental:      false
    
    Server:
     Engine:
      Version:          18.06.3-ce
      API version:      1.38 (minimum version 1.12)
      Go version:       go1.10.3
      Git commit:       d7080c1
      Built:            Wed Feb 20 02:28:17 2019
      OS/Arch:          linux/amd64
      Experimental:     false
    [root@master ~]#
    
    

2.5 安装kubernetes组件

  1. 切换k8s镜像源

    # k8s镜像源在国外,下载速度较慢,切换为阿里云的
    # 编辑(新建文件)/etc/yum.repos.d/kubernetes.repo, 添加如下的配置:
    [root@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=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
    

在这里插入图片描述

  1. 安装kubeadmkubectlkubelet

    # 安装指定版本 1.17.4
    [root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
    
  2. 修改配置文件

    # 配置kubelet的cgroup, 编辑/etc/sysconfig/kubelet,添加如下配置:
    [root@master ~]# vim /etc/sysconfig/kubelet
    KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
    KUBE_PROXY_MODE="ipvs"
    
  3. 设置kubelet为开机自启

    [root@master ~]# systemctl enable kubelet
    

前面2.2-2.5的所有内容需要在三台虚拟机上都进行操作,做一个搭建集群环境的准备

2.6 集群初始化

开始对集群进行初始化,将node节点加入到集群中,下面所有步骤只需要在master节点进行操作即可

  1. 创建集群

    # 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址
    [root@master ~]# kubeadm init --kubernetes-version=v1.17.4 --apiserver-advertise-address=192.168.79.100 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
    # 下面是执行命令之后的运行结果
    W0701 15:41:54.850536    9562 validation.go:28] Cannot validate kube-proxy config - no validator is available
    W0701 15:41:54.850592    9562 validation.go:28] Cannot validate kubelet config - no validator is available
    [init] Using Kubernetes version: v1.17.4
    [preflight] Running pre-flight checks
    [preflight] Pulling images required for setting up a Kubernetes cluster
    [preflight] This might take a minute or two, depending on the speed of your internet connection
    [preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
    [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
    [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
    [kubelet-start] Starting the kubelet
    [certs] Using certificateDir folder "/etc/kubernetes/pki"
    [certs] Generating "ca" certificate and key
    [certs] Generating "apiserver" certificate and key
    [certs] apiserver serving cert is signed for DNS names [master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.79.100]
    [certs] Generating "apiserver-kubelet-client" certificate and key
    [certs] Generating "front-proxy-ca" certificate and key
    [certs] Generating "front-proxy-client" certificate and key
    [certs] Generating "etcd/ca" certificate and key
    [certs] Generating "etcd/server" certificate and key
    [certs] etcd/server serving cert is signed for DNS names [master localhost] and IPs [192.168.79.100 127.0.0.1 ::1]
    [certs] Generating "etcd/peer" certificate and key
    [certs] etcd/peer serving cert is signed for DNS names [master localhost] and IPs [192.168.79.100 127.0.0.1 ::1]
    [certs] Generating "etcd/healthcheck-client" certificate and key
    [certs] Generating "apiserver-etcd-client" certificate and key
    [certs] Generating "sa" key and public key
    [kubeconfig] Using kubeconfig folder "/etc/kubernetes"
    [kubeconfig] Writing "admin.conf" kubeconfig file
    [kubeconfig] Writing "kubelet.conf" kubeconfig file
    [kubeconfig] Writing "controller-manager.conf" kubeconfig file
    [kubeconfig] Writing "scheduler.conf" kubeconfig file
    [control-plane] Using manifest folder "/etc/kubernetes/manifests"
    [control-plane] Creating static Pod manifest for "kube-apiserver"
    [control-plane] Creating static Pod manifest for "kube-controller-manager"
    W0701 15:42:21.370847    9562 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
    [control-plane] Creating static Pod manifest for "kube-scheduler"
    W0701 15:42:21.371810    9562 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
    [etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
    [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
    [apiclient] All control plane components are healthy after 15.006014 seconds
    [upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
    [kubelet] Creating a ConfigMap "kubelet-config-1.17" in namespace kube-system with the configuration for the kubelets in the cluster
    [upload-certs] Skipping phase. Please see --upload-certs
    [mark-control-plane] Marking the node master as control-plane by adding the label "node-role.kubernetes.io/master=''"
    [mark-control-plane] Marking the node master as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
    [bootstrap-token] Using token: l8o7vp.gbiatmb3iexxbppo
    [bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
    [bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
    [bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
    [bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
    [bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
    [kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
    [addons] Applied essential addon: CoreDNS
    [addons] Applied essential addon: kube-proxy
    # 显示集群下载安装完毕
    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/config
    
    You 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/
    
    # 将任意多的worker nodes加入到根中
    Then you can join any number of worker nodes by running the following on each as root:
    
    kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo \
        --discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9
    
    
  2. 创建必要文件:

    sudo chown $(id -u):$(id -g) $HOME/.kube/config# 集群创建完毕之后显示下面这段提示,
    # 需要运行下面这段话
    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/config
      
    [root@master ~]# mkdir -p $HOME/.kube
    [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    # 此时查看node会发现这个集群只有一个master节点,需要将node节点加入到集群中
    [root@master ~]# kubectl get nodes
    NAME     STATUS     ROLES    AGE     VERSION
    master   NotReady   master   4m51s   v1.17.4
    [root@master ~]#
    
  3. 将node的节点加入到集群,需要将如下命令在node1和node2中进行执行

    # 将任意多的worker nodes加入到根中
    Then you can join any number of worker nodes by running the following on each as root:
    
    kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo \
        --discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9
        
    # 分别在node1和node2中运行这两句命令
    [root@node1 ~]# kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo --discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9
    
    [root@node2 ~]# kubeadm join 192.168.79.100:6443 --token l8o7vp.gbiatmb3iexxbppo --discovery-token-ca-cert-hash sha256:dfa1740b693f91f1e3eaf889c50802195d7dc30a4f2a3c7a9b7101b295ad1fe9
    
    #加入到集群之后,查看master机器中集群的节点信息:此时显示所有的node均已添加进来,但是还处于NotReady的状态,需要添加网络插件
    [root@master ~]# kubectl get nodes
    NAME     STATUS     ROLES    AGE    VERSION
    master   NotReady   master   8m9s   v1.17.4
    node1    NotReady   <none>   14s    v1.17.4
    node2    NotReady   <none>   31s    v1.17.4
    [root@master ~]#
    
    
  4. 配置网络插件

    # 下载网络插件到yml文件中
    [root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
    # 控制台的执行结果如下
    --2022-07-01 15:53:27--  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    正在解析主机 raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.109.133, ...
    正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... 已连接。
    已发出 HTTP 请求,正在等待回应... 200 OK
    长度:5750 (5.6K) [text/plain]
    正在保存至: “kube-flannel.yml”
    
    100%[=======================================================================================================================================================================>] 5,750       --.-K/s 用时 0s
    
    2022-07-01 15:53:28 (18.3 MB/s) - 已保存 “kube-flannel.yml” [5750/5750])
    
    # 将文件应用 apply命令
    [root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
    # 执行过程
    podsecuritypolicy.policy/psp.flannel.unprivileged created
    clusterrole.rbac.authorization.k8s.io/flannel created
    clusterrolebinding.rbac.authorization.k8s.io/flannel created
    serviceaccount/flannel created
    configmap/kube-flannel-cfg created
    daemonset.apps/kube-flannel-ds created
    
    # 新开master的控制台窗口, 查看运行进度条情况
    [root@master ~]# kubectl get pods -n kube-system
    NAME                             READY   STATUS              RESTARTS   AGE
    coredns-9d85f5447-4r5vf          0/1     ContainerCreating   0          12m
    coredns-9d85f5447-r9k4g          0/1     ContainerCreating   0          12m
    etcd-master                      1/1     Running             0          12m
    kube-apiserver-master            1/1     Running             0          12m
    kube-controller-manager-master   1/1     Running             0          12m
    kube-flannel-ds-298ct            1/1     Running             0          61s
    kube-flannel-ds-z6whb            1/1     Running             0          61s
    kube-flannel-ds-zl4mx            1/1     Running             0          61s
    kube-proxy-9m6xw                 1/1     Running             0          12m
    kube-proxy-mhssb                 1/1     Running             0          5m23s
    kube-proxy-mnn62                 1/1     Running             0          5m6s
    kube-scheduler-master            1/1     Running             0          12m
    # 查看nodes的状态显示处于Ready状态
    [root@master ~]# kubectl get nodes
    NAME     STATUS   ROLES    AGE     VERSION
    master   Ready    master   13m     v1.17.4
    node1    Ready    <none>   5m46s   v1.17.4
    node2    Ready    <none>   6m3s    v1.17.4
    
    # 所有组件处于running运行状态
    [root@master ~]# kubectl get pods -n kube-system
    NAME                             READY   STATUS    RESTARTS   AGE
    coredns-9d85f5447-4r5vf          1/1     Running   0          13m
    coredns-9d85f5447-r9k4g          1/1     Running   0          13m
    etcd-master                      1/1     Running   0          13m
    kube-apiserver-master            1/1     Running   0          13m
    kube-controller-manager-master   1/1     Running   0          13m
    kube-flannel-ds-298ct            1/1     Running   0          111s
    kube-flannel-ds-z6whb            1/1     Running   0          111s
    kube-flannel-ds-zl4mx            1/1     Running   0          111s
    kube-proxy-9m6xw                 1/1     Running   0          13m
    kube-proxy-mhssb                 1/1     Running   0          6m13s
    kube-proxy-mnn62                 1/1     Running   0          5m56s
    kube-scheduler-master            1/1     Running   0          13m
    [root@master ~]#
    

至此,整个集群已经全部搭建完毕

2.6 集群测试

部署nginx进行集群环境的测试

# 1. 部署nginx 版本 1.14-alpine
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
deployment.apps/nginx created

# 2. 暴露端口
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

# 3. 查看服务状态 一个pod已经正在运行, service服务处于运行状态
[root@master ~]# kubectl get pods,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-6867cdf567-ppmrj   1/1     Running   0          60s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        18m
service/nginx        NodePort    10.104.243.191   <none>        80:30134/TCP   43s

# 4. 获取集群的pod信息
[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6867cdf567-ppmrj   1/1     Running   0          81s
[root@master ~]#

# 5. 根据暴露的端口,可以通过浏览器访问部署的nginx
# 访问地址为: 192.168.79.100:30134
# 访问结果如下图所示:成功访问到部署的nginx页面,部署成功

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43155804/article/details/125831675