• Kubernetes:(三)K8s架构及部署


    目录

    一:K8s架构及流向

    二:k8s组件

    2.1master组件

    2.1.1kube-apiserver

    2.1.2kube-controller-manager  (控制器管理中心-定义资源类型)

    2.1.3kube-scheduler

    2.1.4etcd存储中心

    2.1.5AUTH :认证模块

    2.1.6cloud-controller-manager

    2.2node组件

    2.2.1kubelet

    2.2.2kube-proxy(四层)

    2.2.3docker或rocket

    三:kubernetes集群环境搭建

    3.1 前置知识点

    3.1.1kubeadm 部署方式介绍

    3.1.2安装要求

    3.1.3最终目标

    3.2环境准备

    3.3环境初始化

    3.3.1检查操作系统的版本

    3.3.2主机名解析

    3.3.3时间同步

    3.3.4禁用iptable和firewalld服务

    3.3.5禁用selinux

    3.3.6禁用swap分区

    3.3.7修改linux的内核参数

    3.3.8配置ipvs功能

    3.3.9安装docker(注意docker 版本要一致)

    3.4安装Kubernetes组件

    3.5准备集群镜像

    3.5.1集群初始化

    3.5.2在master上查看节点信息

    3.5.3安装网络插件(CNI)

    3.5.4给node节点打上“node”的标签

    3.5.5查看集群是否健康

    3.6集群测试

    3.6.1创建一个nginx服务

    3.6.2暴露端口

    3.6.3查看服务

    四:扩展:体验Pod

    五: k8s常用命令

    六: 总结

    一:K8s架构及流向

    K8S 也是一个典型的C/S架构,由master端和node端组成

    整体流程:

    ①使用kubectl命令的时候会先进行验证权限(AUTH)
    ②通过API-server 对容器云的资源进行操作
     

    K8S 创建Pod 流程:

    kubectl 创建一个Pod(在提交时,转化为json格式)

    1. 首先经过auth认证(鉴权),然后传递给api-server进行处理
    2. api-server 将请求信息提交给etcd
    3. scheduler和controller-manager 会watch(监听) api-server ,监听请求
    4. 在scheduler 和controller-manager监听到请求后,scheduler 会提交给api-server一个list清单——》包含的是获取node节点信息
    5. 此时api-server就会向etcd获取后端node节点信息,获取到后,被scheduler watch到,然后进行预选优选进行打分,最后将结果给与api-server
    6. 此时api-server也会被controller-manager watch(监听) controller-manager会根据请求创建Pod的配置信息(需求什么控制器)将控制器资源给与api-server
    7. 此时api-server 会提交list清单给与对应节点的kubelet(代理)
    8. kubelet代理通过K8S与容器的接口(例如containerd)进行交互,假设是docker容器,那么此时kubelet就会通过dockershim 以及runc接口与docker的守护进程docker-server进行交互,来创建对应的容器,再生成对应的Pod
    9. kubelet 同时会借助于metrics server 收集本节点的所有状态信息,然后再提交给api-server
    10. 最后api-server会提交list清单给与etcd来存储(最后api-server会将数据维护在etcd中)
    1. 简单版:
    2. 首先kubectl 转化为json后,向api-server 提交创建Pod请求
    3. api-server将请求信息记录在etcd中
    4. scheduler 监听api-server处理的请求,然后向api-server申请后端节点信息
    5. api-server 从etcd中获取后端节点信息后,给与scheduler
    6. scheduler 进行预选优选、打分,然后提交结果给api-server
    7. controller-manager 监听api-server处理的请求信息,并将所需的控制器资源给与api-server
    8. api-server 对接node节点的kubelet
    9. kubelet调用资源创建pod,并将统计信息返回给api-server
    10. api-server将信息记录在etcd中

    用户访问流程:

    • 假设用户需创建 nginx资源(网站/调度)kubectl ——》auth ——》api-server
    • 基于yaml 文件的 kubectl create run / apply -f nginx.yaml(pod 一些属性,pod )
    • 请求发送至master 首先需要经过apiserver(资源控制请求的唯一入口)
    • apiserver 接收到请求后首先会先记载在Etcd中
    • Etcd的数据库根据controllers manager(控制器) 查看创建的资源状态(有无状态化)
    • 通过controllers 触发 scheduler (调度器)
    • scheduler 通过验证算法() 验证架构中的nodes节点,筛选出最适合创建该资源,接着分配给这个节点进行创建
    • node节点中的kubelet 负责执行master给与的资源请求,根据不同指令,执行不同操作
    • 对外提供服务则由kube-proxy开设对应的规则(代理)
    • container 容器开始运行(runtime 生命周期开始计算)
    • 外界用户进行访问时,需要经过kube-proxy -》service 访问到container (四层)
    • 如果container 因故障而被销毁了,master节点的controllers 会再次通过scheduler 资源调度通过kubelet再次创建容器,恢复基本条件限制(控制器,维护pod状态、保证期望值-副本数量)
    • pod ——》ip 进行更改——》service 定义统一入口(固定被访问的ip:端口)

    二:k8s组件

    2.1master组件

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

    2.1.1kube-apiserver

    • 用于暴露Kubernetes API,任何资源请求或调用操作都是通过kube-apiserver 提供的接口进行。以HTTP Restful API提供接口服务,所有对象资源的增删改查和监听操作都交给API Server 处理后再提交给Etcd 存储(相当于分布式数据库,以键值对方式存储)。
    • 可以理解成API Server 是K8S的请求入口服务。API server 负责接收K8S所有请求(来自UI界面或者CLI 命令行工具),然后根据用户的具体请求,去通知其他组件干活。可以说API server 是K8S集群架构的大脑。

    2.1.2kube-controller-manager  (控制器管理中心-定义资源类型)

    • 运行管理控制器,是k8s集群中处理常规任务的后台线程,是k8s集群里所有资源对象的自动化控制中心。
    • 在k8s集群中,一个资源对应一个控制器,而Controller manager 就是负责管理这些控制器的。
    • 由一系列控制器组成,通过API Server监控整个集群的状态,并确保集群处于预期的工作状态,比如当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
    控制器功能
    NodeContrpller(节点控制器)负责在节点出现故障时发现和响应
    Replication Controller ( 副本控制器)负责保证集群中一个RC (资源对象ReplicationController) 所关联的Pod副本数始终保持预设值。可以理解成确保集群中有且仅有N个Pod实例,N是RC中定义的Pod副本数量
    Endpoints Controller (端点控制器)

    填充端点对象(即连接Services 和Pods) ,负责监听Service 和对应的Pod 副本的变化。可以理解端点是一个服务暴露出来的访问点,

    如果需要访问一个服务,则必须知道它的  endpoint

    Service Account & Token Controllers (服务帐户和令牌控制器)为新的命名空间创建默认帐户和API访问令牌
    ResourceQuotaController(资源配额控制器)确保指定的资源对象在任何时候都不会超量占用系统物理资源
    Namespace Controller (命名空间控制器)管理namespace的生命周期
    Service Controller (服务控制器)属于K8S集群与外部的云平台之间的- -个接口控制器

    2.1.3kube-scheduler

    • 根据调度算法(预选/优选的策略)为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
    • 可以理解成K8S所有Node 节点的调度器。当用户要部署服务时,scheduler 会根据调度算法选择最合适的Node 节点来部署Pod。
    • API Server 接收到请求创建一批Pod,API Server 会让Controller-manager 按照所预设的模板去创建Pod,Controller-manager 会通过API Server去找Scheduler 为新创建的Pod选择最适合的Node 节点。比如运行这个Pod需要2C4G 的资源,Scheduler 会通过预算策略在所有Node节点中挑选最优的。Node 节点中还剩多少资源是通过汇报给API Server 存储在etcd 里,API Server 会调用一个方法找到etcd 里所有Node节点的剩余资源,再对比Pod 所需要的资源,在所有Node 节点中查找哪些Node节点符合要求。
    • 如果都符合,预算策略就交给优选策略处理,优选策略再通过CPU的负载、内存的剩余量等因素选择最合适的Node 节点,并把Pod调度到这个Node节点上运行。
    • controller manager会通过API Server通知kubelet去创建pod,然后通过kube-proxy中的service对外提供服务接口。(node组件)

    2.1.4etcd存储中心

    • 分布式键值存储系统(特性:服务自动发现)。用于保存集群状态数据,比如Pod、Service等对象信息
    • k8s中仅API Server 才具备读写权限,其他组件必须通过API Server 的接口才能读写数据

    PS:etcd V2版本:数据保存在内存中

    v3版本:引入本地volume卷的持久化(可根据磁盘进行恢复),服务发现,分布式(方便扩容,缩容)

    etcd是一种定时全量备份+持续增量备份的持久化方式,最后存储在磁盘中

    kubernetes 1.11版本前不支持v3,我用的事K8S 1.15

    ETCD一般会做为3副本机制(奇数方式),分布在三台master上(也有的公司单独用服务器部署ETCD )

    master:奇数的方式部署(多节点的时候)

    2.1.5AUTH :认证模块

    K8S 内部支持使用RBAC认证的方式进行认证 

    2.1.6cloud-controller-manager

    云控制器管理器是指嵌入特定云的控制逻辑的 控制平面组件。 云控制器管理器允许您链接集群到云提供商的应用编程接口中, 并把和该云平台交互的组件与只和您的集群交互的组件分离开。
    cloud-controller-manager 仅运行特定于云平台的控制回路。 如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, 所部署的环境中不需要云控制器管理器。
    与 kube-controller-manager 类似,cloud-controller-manager 将若干逻辑上独立的 控制回路组合到同一个可执行文件中,供你以同一进程的方式运行。 你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。

    下面的控制器都包含对云平台驱动的依赖:
    – ● 节点控制器(Node Controller): 用于在节点终止响应后检查云提供商以确定节点是否已被删除
    – ● 路由控制器(Route Controller): 用于在底层云基础架构中设置路由
    – ● 服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡

    2.2node组件

    2.2.1kubelet

    kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器

    kubelet —》先和docker引擎进行交互—》docker容器(一组容器跑在Pod中)

    2.2.2kube-proxy(四层)

    在Node节点上实现Pod网络代理,维护网络规则、pod之间通信和四层负载均衡工作。默认会写入规则至iptables ,目前支持IPVS、同时还支持namespaces

    对于七层的负载,k8s官方提供了一种解决方案;ingress-nginx

    2.2.3docker或rocket

    容器引擎,运行容器


    三:kubernetes集群环境搭建

    3.1 前置知识点

    目前生产部署Kubernetes 集群主要有两种方式:

    1. kubeadm

    Kubeadm 是一个K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署Kubernetes 集群。

    官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

    2. 二进制包

    从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。

    Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护

    3.1.1kubeadm 部署方式介绍

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

    • 创建一个Master 节点kubeadm init
    • 将Node 节点加入到当前集群中$ kubeadm join

    3.1.2安装要求

    在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:

    • 一台或多台机器,操作系统CentOS7.x-86_x64
    • 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘30GB 或更多
    • 集群中所有机器之间网络互通
    • 可以访问外网,需要拉取镜像
    • 禁止swap 分区

    3.1.3最终目标

    • 在所有节点上安装Docker 和kubeadm
    • 部署Kubernetes Master
    • 部署容器网络插件
    • 部署Kubernetes Node,将节点加入Kubernetes 集群中
    • 部署Dashboard Web 页面,可视化查看Kubernetes 资源

    3.2环境准备

    角色IP地址组件
    master192.168.137.20docker,kubectl,kubeadm,kubelet
    node01192.168.137.10docker,kubectl,kubeadm,kubelet
    node02192.168.137.30docker,kubectl,kubeadm,kubelet

    3.3环境初始化

    3.3.1检查操作系统的版本

    1. cat /etc/redhat-release
    2. #此方式下安装kubernetes集群要求Centos版本要在7.5或之上

    3.3.2主机名解析

    为了方便集群节点间的直接调用,在这个配置一下主机名解析,企业中推荐使用内部DNS服务器

    1. # 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
    2. 192.168.137.20 master
    3. 192.168.137.10 node01
    4. 192.168.137.30 node02

    3.3.3时间同步

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

    企业中建议配置内部的会见同步服务器

    1. #启动chronyd服务
    2. [root@master ~]# systemctl start chronyd
    3. [root@master ~]# systemctl enable chronyd
    4. [root@master ~]# date

    3.3.4禁用iptable和firewalld服务

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

    1. # 1 关闭firewalld服务
    2. [root@master ~]# systemctl stop firewalld
    3. [root@master ~]# systemctl disable firewalld
    4. # 2 关闭iptables服务
    5. [root@master ~]# systemctl stop iptables
    6. [root@master ~]# systemctl disable iptables

    3.3.5禁用selinux

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

    1. #编辑 /etc/selinux/config 文件,修改SELINUX的值为disable
    2. #注意修改完毕之后需要重启linux服务
    3. SELINUX=disabled

    3.3.6禁用swap分区

    swap分区值的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用sqap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备

    1. #编辑分区配置文件/etc/fstab,注释掉swap分区一行
    2. #注意修改完毕之后需要重启linux服务
    3. vim /etc/fstab
    4. 注释掉 /dev/mapper/centos-swap swap
    5. # /dev/mapper/centos-swap swap
    6. swapoff -a # 临时关闭
    7. sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭

    3.3.7修改linux的内核参数

    1. #修改linux的内核采纳数,添加网桥过滤和地址转发功能
    2. #编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
    3. net.bridge.bridge-nf-call-ip6tables = 1
    4. net.bridge.bridge-nf-call-iptables = 1
    5. net.ipv4.ip_forward = 1
    6. # 重新加载配置
    7. [root@master ~]# sysctl -p 或者 sysctl --system # 生效
    8. # 加载网桥过滤模块
    9. [root@master ~]# modprobe br_netfilter
    10. # 查看网桥过滤模块是否加载成功
    11. [root@master ~]# lsmod | grep br_netfilter

    3.3.8配置ipvs功能

    在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

    1. # 1.安装ipset和ipvsadm
    2. [root@master ~]# yum install ipset ipvsadmin -y
    3. ipvsadm没有也可以
    4. # 2.添加需要加载的模块写入脚本文件
    5. [root@master ~]# cat < /etc/sysconfig/modules/ipvs.modules
    6. #!/bin/bash
    7. modprobe -- ip_vs
    8. modprobe -- ip_vs_rr
    9. modprobe -- ip_vs_wrr
    10. modprobe -- ip_vs_sh
    11. modprobe -- nf_conntrack_ipv4
    12. EOF
    13. # 3.为脚本添加执行权限
    14. [root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
    15. # 4.执行脚本文件
    16. [root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
    17. # 5.查看对应的模块是否加载成功
    18. [root@master ~]# lsmod | grep -e -ip_vs -e nf_conntrack_ipv4
    19. nf_conntrack_ipv4 15053 10
    20. nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
    21. nf_conntrack 133095 10 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,nf_nat_masquerade_ipv6,nf_conntrack_netlink,nf_conntrack_ipv4,nf_conntrack_ipv6

    3.3.9安装docker(注意docker 版本要一致)

    1. # 1、切换镜像源
    2. yum install wget -y
    3. [root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
    4. # 2、查看当前镜像源中支持的docker版本
    5. [root@master ~]# yum list docker-ce --showduplicates
    6. # 3、安装特定版本的docker-ce
    7. # 必须制定--setopt=obsoletes=0,否则yum会自动安装更高版本
    8. [root@master ~]# yum install --setopt=obsoletes=0 docker-ce-20.10.17 -y
    9. # 4、添加一个配置文件
    10. #Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
    11. [root@master ~]# mkdir /etc/docker
    12. [root@master ~]# cat < /etc/docker/daemon.json
    13. {
    14. "exec-opts": ["native.cgroupdriver=systemd"],
    15. "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
    16. }
    17. EOF
    18. # 5、启动dokcer
    19. [root@master ~]# systemctl restart docker
    20. [root@master ~]# systemctl enable docker

    3.4安装Kubernetes组件

    1. # 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
    2. # 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
    3. cat < /etc/yum.repos.d/kubernetes.repo
    4. [kubernetes]
    5. name=Kubernetes
    6. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    7. enabled=1
    8. gpgcheck=0
    9. repo_gpgcheck=0
    10. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    11. EOF
    12. [root@k8s-node1 ~]# yum makecache
    13. # 3、安装kubeadm、kubelet和kubectl
    14. [root@master ~]# yum install --setopt=obsoletes=0 kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y
    15. # 4、配置kubelet的cgroup
    16. #编辑/etc/sysconfig/kubelet, 添加下面的配置
    17. KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
    18. KUBE_PROXY_MODE="ipvs"
    19. # 5、设置kubelet开机自启
    20. [root@master ~]# systemctl enable --now kubelet
    21. # 6、 查看是否安装成功
    22. yum list installed | grep kubelet
    23. yum list installed | grep kubeadm
    24. yum list installed | grep kubectl

    版本查看

    kubelet --version

    3.5准备集群镜像

    1. # 在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
    2. [root@master ~]# kubeadm config images list
    3. # 下载镜像
    4. # 此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案
    5. images=(
    6. kube-apiserver:v1.17.4
    7. kube-controller-manager:v1.17.4
    8. kube-scheduler:v1.17.4
    9. kube-proxy:v1.17.4
    10. pause:3.1
    11. etcd:3.4.3-0
    12. coredns:1.6.5
    13. )
    14. for imageName in ${images[@]};do
    15. docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    16. docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
    17. docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    18. done

    扩展: 

    如果正确安装到这里的时候,已经成功安装一大半了,如上的配置都是需要在所有的节点进行配置。可通过xshell工具将所有指令发送到所有的虚拟机,操作如下。 

     另外,有一些配置是需要重启才能生效的,因此,这里可以重启一下。

    3.5.1集群初始化

    下面的操作只需要在master节点上执行即可!!! 

    1. # 创建集群
    2. [root@master ~]# kubeadm init \
    3. --apiserver-advertise-address=192.168.137.20 \
    4. --image-repository registry.aliyuncs.com/google_containers \
    5. --kubernetes-version=v1.19.4 \
    6. --service-cidr=10.96.0.0/12 \
    7. --pod-network-cidr=10.244.0.0/16 \
    8. --ignore-preflight-errors=all
    9. --apiserver-advertise-address 集群通告地址
    10. --image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
    11. --kubernetes-version K8s版本,与上面安装的一致
    12. --service-cidr 集群内部虚拟网络,Pod统一访问入口
    13. --pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
    14. #####################################################################
    15. # 创建必要文件,拷贝k8s认证文件
    16. [root@master ~]# mkdir -p $HOME/.kube
    17. [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    18. [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

    192.168.137.20是主节点的地址,要自行修改。其它的不用修改 

    1. 部分英文翻译
    2. # 恭喜你Kubernetes control-plane创建成功
    3. Your Kubernetes control-plane has initialized successfully!
    4. # 接下来你要运行下面这三段话
    5. To start using your cluster, you need to run the following as a regular user:
    6. mkdir -p $HOME/.kube
    7. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    8. sudo chown $(id -u):$(id -g) $HOME/.kube/config
    9. Alternatively, if you are the root user, you can run:
    10. export KUBECONFIG=/etc/kubernetes/admin.conf
    11. # 你应该在集群上部署一个pod网络。
    12. You should now deploy a pod network to the cluster.
    13. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
    14. https://kubernetes.io/docs/concepts/cluster-administration/addons/
    15. #你可以添加任意多的control-plane,用下面这段命令:
    16. You can now join any number of control-plane nodes by copying certificate authorities
    17. and service account keys on each node and then running the following as root:
    18. kubeadm join master-cluster-endpoint:6443 --token 9ezt8v.yx2owzdiaif06so8 \
    19. --discovery-token-ca-cert-hash sha256:a637ba2a840714a375e6bbc7212123bf8cdd1333317e53731425b6d39af9eafe \
    20. --control-plane
    21. #你可以添加任意多的worker-nodes ,用下面这段命令:
    22. Then you can join any number of worker nodes by running the following on each as root:
    23. kubeadm join master-cluster-endpoint:6443 --token 9ezt8v.yx2owzdiaif06so8 \
    24. --discovery-token-ca-cert-hash sha256:a637ba2a840714a375e6bbc7212123bf8cdd1333317e53731425b6d39af9eafe

    下面的操作只需要在node节点上执行即可 !!!

    这里复制上面生成的一串命令,我这里只是示例,命令根据你实际生成的复制去node节点执行

     kubeadm join 192.168.137.20:6443 --token qi0907.gdeuyidf7zwcatvg \
        --discovery-token-ca-cert-hash sha256:d72c6bf13bfda302eeef11821a5a254cb7664142618668c10575795afe4a115b

    扩展:默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:

     kubeadm token create --print-join-command
    1. #列出token
    2. kubeadm token list | awk -F" " '{print $1}' |tail -n 1
    3. #然后获取CA公钥的的hash值
    4. openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^ .* //'
    5. #替换join中token及sha256:
    6. kubeadm join 192.168.137.20:6443 --token zwl2z0.arz2wvtrk8yptkyz \
    7. --discovery-token-ca-cert-hash sha256:e211bc7af55310303fbc7126a1bc7289f16b046f8798008b68ee01051361cf02

    3.5.2在master上查看节点信息

    kubectl get nodes查看的时候所有的节点是NotReady状态。

    3.5.3安装网络插件(CNI)

    下面两种插件二选一,master上执行,如果是云服务器建议按照flannel,calico可能会和云网络环境有冲突

    1. 安装flannel插件(轻量级用于快速搭建使用,初学推荐)

    下载yaml文件

    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

    修改net-conf.json下面的网段为上面init pod-network-cidr的网段地址(必须正确否则会导致集群网络问题) 

    sed -i 's/10.240.0.0/10.244.0.0/' kube-flannel.yml

    修改完安装插件,执行

    1. kubectl apply -f kube-flannel.yml
    2. kubectl get pods -n kube-system

    2. 安装calico插件(用于复杂网络环境) 

    下载yaml文件

    wget  https://docs.projectcalico.org/v3.9/manifests/calico.yaml

    修改配置文件的网段为上面init pod-network-cidr的网段地址(必须正确否则会导致集群网络问题)

    sed -i 's/192.168.0.0/10.244.0.0/g' calico.yaml

    修改完安装插件,执行

    1. kubectl apply -f calico.yaml
    2. 确认一下calico是否安装成功(耐心等待,coredns和calico为Running状态后再进行后面的操作)
    3. kubectl get pods --all-namespaces -w
    4. kubectl get pod --all-namespaces -o wide

    由于外网不好访问,如果出现无法访问的情况,可以直接用下面的 记得文件名是kube-flannel.yml,位置:/root/kube-flannel.yml内容: 

    https://github.com/flannel-io/flannel/tree/master/Documentation/kube-flannel.yml

    1. #这里使用的是flannel插件
    2. wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    3. kubectl apply -f kube-flannel.yml
    4. kubectl get pods -n kube-system
    5. kubectl get nodes

    扩展:

    1. 更改以下俩个文件
    2. vim /etc/kubernetes/manifests/kube-scheduler.yaml
    3. vim /etc/kubernetes/manifests/kube-controller-manager.yaml
    4. #一个是控制资源管理器,一个是资源调度器
    5. # 修改如下内容
    6. 把--bind-address=127.0.0.1变成--bind-address=192.168.137.20 #修改成k8s的控制节点master的ip
    7. 把httpGet:字段下的hosts由127.0.0.1变成192.168.137.20(有两处)
    8. #如果容器没起来不修改用默认的127.0.0.1也可以!!!
    9. #- --port=0 # 搜索port=0,把这一行注释掉
    10. systemctl restart kubelet #重新启动

    ps:直接注释掉--port=0也可以,可以不用修改地址!!!

    3.5.4给node节点打上“node”的标签

    1. kubectl label node node01 node-role.kubernetes.io/node=node
    2. kubectl label node node02 node-role.kubernetes.io/node=node
    3. kubectl get nodes

    3.5.5查看集群是否健康

    至此,集群搭建完成!!!!!

    3.6集群测试

    3.6.1创建一个nginx服务(错误示例!!不要用!!)

    kubectl create deployment nginx --image=nginx

    3.6.2暴露端口

    kubectl expose deployment nginx --port=80 --type=NodePort

    3.6.3查看服务

    1. kubectl get pod,svc
    2. #这样创建有问题,分开创建虽名字相同都是nginx但是不能互相连接
    3. 这错误示例不要使用!!!!!
    4. 如果你使用了,使用kubectl delete删除,删除卡住了需要把所有机器重启即可

    浏览器测试结果:


    四:扩展:体验Pod

    1.定义pod.yml文件,比如pod_nginx_rs.yaml

    1. cat > pod_nginx_rs.yaml <
    2. apiVersion: apps/v1
    3. kind: ReplicaSet
    4. metadata:
    5. name: nginx
    6. labels:
    7. tier: frontend
    8. spec:
    9. replicas: 3
    10. selector:
    11. matchLabels:
    12. tier: frontend
    13. template:
    14. metadata:
    15. name: nginx
    16. labels:
    17. tier: frontend
    18. spec:
    19. containers:
    20. - name: nginx
    21. image: nginx
    22. ports:
    23. - containerPort: 80
    24. EOF

     2.根据pod_nginx_rs.yml文件创建pod

    kubectl apply -f pod_nginx_rs.yaml

    3.查看pod

    1. kubectl get pods
    2. kubectl get pods -o wide
    3. kubectl describe pod nginx

     4.感受通过ReplicaSet将pod扩容

    1. kubectl scale rs nginx --replicas=5
    2. kubectl get pods -o wide

    5.删除pod

    kubectl delete -f pod_nginx_rs.yaml

    五: k8s常用命令

    查看pod,service,endpoints,secret等等的状态

    1. kubectl get 组件名
    2. # 例如kubectl get pod 查看详细信息可以加上-o wide 其他namespace的指定 -n namespace

    创建、变更一个yaml文件内资源,也可以是目录,目录内包含一组yaml文件(实际使用中都是以yaml文件为主,直接使用命令创建pod的很少,推荐多使用yaml文件)

    1. kubectl apply -f xxx.yaml
    2. # 例如kubectl apply -f nginx.yaml 这里是如果没有则创建,如果有则变更,比create好用

    删除一个yaml文件内资源,也可以是目录,目录内包含一组yaml文件

    1. kubectl delete -f xxx.yaml
    2. # 例如kubectl delete -f nginx.yaml

    查看资源状态,比如有一组deployment内的pod没起来,一般用于pod调度过程出现的问题排查

    1. kubectl describe pod pod名
    2. # 先用kubectl get pod查看 有异常的复制pod名使用这个命令

     查看pod日志,用于pod状态未就绪的故障排查

    1. kubectl logs pod名
    2. # 先用kubectl get pod查看 有异常的复制pod名使用这个命令

    查看node节点或者是pod资源(cpu,内存资源)使用情况

    1. kubectl top 组件名
    2. # 例如kubectl top node kubectl top pod

    进入pod内部

    1. kubectl exec -ti pod名 /bin/bash
    2. # 先用kubectl get pod查看 有需要的复制pod名使用这个命令

    六: 总结

    kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:

    • 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
    • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
    • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
    • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
    • 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
    • 存储编排:可以根据容器自身的需求自动创建存储卷
  • 相关阅读:
    Java并发编程—线程池
    golang实现循环队列
    flutter升级AS和gradle后编译出错(No signature of method: build_gbqp6.android())错误
    VCSEL和VCSEL阵列仿真
    MSDC 4.3 接口规范(26)
    计算机毕业设计springboot教学物资管理系统f1v89源码+系统+程序+lw文档+部署
    MySQL数据库基础 09
    [Docker]八.Docker 容器跨主机通讯
    servlet 的XML Schema从哪边获取
    将ndarray对象的数据按索引矩阵进行选取的几种方法
  • 原文地址:https://blog.csdn.net/ver_mouth__/article/details/125994971