• Kubernetes - Kubernetes详解;安装部署(一)


    一、Kubernetes

    Kubernetes 这个单词源于希腊语,意为“舵手”或“飞行员”。

    Kubernetes,也称为K8S,其中8是代表中间“ubernete”的8个字符,是Google在2014年开源的一个容器编排引擎,作为CNCF(Cloud Native Computing Foundation;云原生计算基金会)最重要的组件之一

    Kubernetes用于自动化容器化应用程序的部署、规划、扩展和管理,它将组成应用程序的容器分组为逻辑单元,以便于管理和发现,用于管理云平台中多个主机上的容器化的应用

    Kubernetes 的目标是让部署容器化的应用简单并且高效,很多细节都不需要运维人员去进行复杂的手工配置和处理

    Kubernetes官网
    Kubernetes  

    GitHub地址:

    GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management

    Kubernetes中文文档:

    Kubernetes 是什么? | Kubernetes

    Kubernetes是采用Go语言(Go语言是谷歌2009发布的一款开源编程语言)开发

    二、Kubernetes 架构

    (一)Master

    k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求

    Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 组成

    1、集群API:kube-apiserver

    kube-apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。

    当需要与 Kubernetes 集群进行交互时,就要通过 API。 Kubernetes API是 Kubernetes Control Plane的前端,用于处理内部和外部请求。API 服务器会确定请求是否有效,如果有效,则对其进行处理。用户通过 REST 调用、kubectl 命令行界面或其他命令行工具(例如 kubeadm)来访问 API。

    2、集群调度:kube-scheduler

    kube-scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上

    调度程序会考虑容器集的资源需求(例如 CPU 或内存)以及集群的运行状况。随后,它会将容器集安排到适当的计算节点。

    3、集群控制器:kube-controller-manager

    kube-controller-manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等

    控制器负责实际运行集群,而 Kubernetes 控制器管理器则是将多个控制器功能合而为一。控制器用于查询调度程序,并确保有正确数量的容器集在运行。如果有容器集停止运行,另一个控制器会发现并做出响应。控制器会将服务连接至容器集,以便让请求前往正确的端点。还有一些控制器用于创建帐户和 API 访问令牌。

    4、键值存储数据库:etcd

    etcd保存了整个集群的状态

    应用的配置数据以及有关集群状态的信息位于etcd(k-v数据库)中。etcd 采用分布式、容错设计,被视为集群的最终事实来源

    (二)Nodes

    集群工作节点,运行用户业务应用容器

    Nodes节点也叫Worker Node,包含kubelet、kube proxy 和 Pod(Container Runtime)

    1、Pod

    Pod是 Kubernetes 对象模型中最小、最简单的单元

    它代表了应用的单个实例。每个Pod都由一个容器(或一系列紧密耦合的容器)以及若干控制容器运行方式的选件组成。Pod可以连接至持久存储,以运行有状态应用

    2、Container Runtime Engine

    Container runtime负责镜像管理以及Pod和容器的真正运行(CRI)

    为了运行容器,每个Node都有一个容器运行时引擎。比如Docker,但 Kubernetes 也支持其他符合开源容器运动(OCI)标准的容器,例如 rkt 和 CRI-O。Kubernetes支持实现了CRI接口的其他大多数的容器

    3、kubelet

    kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理

    每个计算节点中都包含一个 kubelet,这是一个与Control Plane通信的微型应用。kublet 可确保容器在Pod内运行。当Control Plane需要在节点中执行某个操作时,kubelet 就会执行该操作

    4、kube-proxy

    kube-proxy负责为Service提供cluster内部的服务发现和负载均衡

    每个计算节点中还包含 kube-proxy,这是一个用于优化 Kubernetes 网络服务的网络代理。kube-proxy 负责处理集群内部或外部的网络通信(靠操作系统的数据包过滤层,或者自行转发流量)

    三、Kubeadm部署Kubernetes

    (一)Kubernetes环境搭建方式

    1、minikube

    minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便可以试用Kubernetes或进行日常开发工作

    Hello Minikube | Kubernetes

    2、kind

    Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker

    kind

    3、kubeadm

    Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;

    官方地址:

    Kubeadm | Kubernetes

    Installing kubeadm | Kubernetes

    安装 kubeadm | Kubernetes

    4、二进制包

    从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是可以对各个组件有更清晰的认识

    5、yum安装

    通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老,所以这种方式用得也比较少了

     6、第三方工具

    有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;

     7、花钱购买

    直接购买类似阿里云这样的公有云平台k8s

    (二)Kubeadm部署Kubernetes

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

     1、创建一个Master节点:kubeadm init

     2、将Node节点加入到Master集群中: kubeadm join

    (三)Kubernetes部署环境要求

    (1)一台或多台机器,操作系统CentOS 7.x-86_x64

    (2)硬件配置:内存2GB或2G+,CPU 2核或CPU 2核+

    (3)集群内各个机器之间能相互通信

    (4)禁止swap分区

    (5)集群内各个机器可以访问外网,需要拉取镜像

    如果环境不满足要求,会报错如下

      

    (四)Kubernetes部署环境准备

    1、关闭防火墙

    1. systemctl stop firewalld
    2. systemctl disable firewalld

    2、 关闭selinux

    1. sed -i 's/enforcing/disabled/' /etc/selinux/config #永久
    2. setenforce 0 #临时

    3、 关闭swap(k8s禁止虚拟内存以提高性能)

    1. sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
    2. swapoff -a #临时

    4、 在master添加hosts

    1. cat >> /etc/hosts << EOF
    2. 192.168.132.129 k8smaster
    3. 192.168.132.130 k8snode
    4. EOF

    5、设置网桥参数

    1. cat > /etc/sysctl.d/k8s.conf << EOF
    2. net.bridge.bridge-nf-call-ip6tables = 1
    3. net.bridge.bridge-nf-call-iptables = 1
    4. EOF
    5. sysctl --system #生效

    6、同步时间

    1. yum install ntpdate -y #如果没有ntpdate命令先安装
    2. ntpdate time.windows.com

    (五)Kubernetes安装具体步骤

    1、安装 Docker

    所有服务器节点安装 Docker/kubeadm/kubelet/kubectl

    Kubernetes 默认容器运行环境是Docker,因此首先需要安装Docker

    我们可以按照下述方式安装指定版本Docker 

    1. //更新docker的yum源
    2. yum install wget -y
    3. wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
    4. //安装指定版本的docker:
    5. yum install docker-ce-20.10.0 -y

    安装、卸载可参考官网最新文档

    Install Docker Engine on CentOS | Docker Documentation

    Docker版本说明

    Docker Engine release notes | Docker Documentation

    配置加速器加速下载

    /etc/docker/daemon.json  如果此文件不存在,先创建

    1. {
    2. # 阿里云镜像加速器;可自己注册复制过来
    3. "registry-mirrors": ["https://registry.docker-cn.com"]
    4. }

      

    执行 

    systemctl enable docker.service

     搭建:kubeadm、kubelet、kubectl

    Kubelet

    运行在cluster所有节点上,负责启动POD和容器

    Kubeadm:

    用于初始化cluster的一个工具

    Kubectl:

    kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件

    2、 添加k8s的阿里云YUM源

    1. cat > /etc/yum.repos.d/kubernetes.repo << EOF
    2. [kubernetes]
    3. name=Kubernetes
    4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    5. enabled=1
    6. gpgcheck=0
    7. repo_gpgcheck=0
    8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    9. EOF

    3、安装 kubeadm,kubelet 和 kubectl

    Kubernetes版本如下

    补丁版本 | Kubernetes

    yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y

    查看是否安装:

    1. yum list installed | grep kubelet
    2. yum list installed | grep kubeadm
    3. yum list installed | grep kubectl

    查看安装的版本:

    1. kubeadm version
    2. kubectl version --client
    3. kubelet --version

    安装完成后执行

    systemctl enable kubelet.service

    重启CentOS: reboot 

    Linux centos重启命令:

    1、reboot 普通重启

    2、shutdown -r now 立刻重启(root用户使用)

    3、shutdown -r 10 过10分钟自动重启(root用户使用)

    4、shutdown -r 10:30 在时间为10:30重启(root用户使用)

    4、部署Kubernetes Master主节点 

    (2)在master机器上执行

    1. kubeadm init
    2. --apiserver-advertise-address=192.168.133.129
    3. --control-plane-endpoint=master
    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

    参数说明:

            --apiserver-advertise-address 集群通告地址,主节点id

            --control-plane-endpoint 主节点的主机名

            --image-repository  由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址

            --kubernetes-version K8s版本,与上面安装的一致

            --service-cidr 集群内部虚拟网络,Pod统一访问入口

            --pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一

    注:

    service-cidr 的选取不能和PodCIDR及本机网络有重叠或者冲突,一般可以选择一个本机网络和PodCIDR都没有用到的私网地址段,比如PODCIDR使用10.244.0.0/16, 那么service cidr可以选择10.96.0.0/12,网络无重叠冲突即可 

    执行报错

    重启一下centos,然后再执行上面的 kubeadm init 命令

    试了一下,重启centos还是会报同样的错误仔细排查;“kube-apiserver.yaml,kube-controller-manager.yaml,kube-scheduler.yaml,etcd.yaml” 这几个yaml文件已经存在了,只要重置一下即可

    1. kubeadm reset
    2. mv /etc/containerd/config.toml /tmp/
    3. systemctl restart containerd

    然后重新输入上述的 kubeadm init 命令,会拿到如下输出,粘贴最后一段
    kubeadm join IP:PORT --token XX \
        --discovery-token-ca-cert-hash sha256:XX 

    备用(集群添加新节点,执行的命令就是kubeadm init最后输出的kubeadm join命令)

    1. kubeadm join 192.168.133.129:6443 --token vx912w.g8wyei3zo8qem1mq \
    2. --discovery-token-ca-cert-hash sha256:5c08ca34fed1e3fcef41e581970d3046ac85db10ee4a3875efb0bca5c8f8b104

    上图中1 表示 初始化成功

    2 表示 集群还需要的操作

    3 表示 添加节点令牌(24小时有效期,过期再去获取令牌即可)

    重新获取令牌

    kubeadm token create --print-join-command

    (2)在master机器上执行(配置环境变量

    1. mkdir -p $HOME/.kube
    2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    3. sudo chown $(id -u):$(id -g) $HOME/.kube/config
    4. kubectl get nodes

    如果遇到如下报错:

    1. sudo: /etc/sudoers is world writable
    2. sudo: no valid sudoers sources found, quitting
    3. sudo: unable to initialize policy plugin

    因为 /etc/sudoers 文件只读,所以sudo chmod 777 /etc/sudoers ,结果可以修改这个文件了,但是导致所有用户的sudo都不能用了

    我们可以输入命令修改sudoers的权限:

    1. chmod 0440 /etc/sudoers 
    2. reboot

    再输入 reboot重启即可

     kubectl get nodes

    5、把node节点加入Kubernetes master中,在Node机器上执行

    向集群添加新节点,执行的命令就是kubeadm init最后输出的kubeadm join命令

    1. kubeadm join 192.168.133.129:6443 --token vx912w.g8wyei3zo8qem1mq \
    2. --discovery-token-ca-cert-hash sha256:5c08ca34fed1e3fcef41e581970d3046ac85db10ee4a3875efb0bca5c8f8b104

     kubectl get nodes 

    (六)部署网络插件(master主节点机器运行)

    1、下载kube-flannel.yml文件

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

    2、应用kube-flannel.yml文件得到运行时容器

    kubectl apply -f kube-flannel.yml

    3、查看节点状态: kubectl get nodes

    不会立即就绪,需要等一会儿,节点才会就绪

    检查状态是否成功 

    1. kubectl get cs
    2. kubectl cluster-info

    查看运行时容器pod(一个pod里面运行了多个docker容器)

    kubectl get pods -n kube-system

    到这里,我们的k8s环境搭建OK !!!

    四、Kubernetes部署“容器化应用”(测试kubernetes集群

    在集群中创建一个pod,验证是否正常运行

    1、在Kubernetes集群中部署一个Nginx

    1、在网上拉取一个nginx镜像

    kubectl create deployment nginx --image=nginx

    2、对外暴露一个80端口

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

    3、查看对外端口

    kubectl get pod,svc

    4、访问地址:http://NodeIP:Port

     2、在Kubernetes集群中部署一个Tomcat

    1. kubectl create deployment tomcat --image=tomcat
    2. kubectl expose deployment tomcat --port=8080 --type=NodePort
    3. kubectl get pod,svc

    访问地址:http://NodeIP:Port

  • 相关阅读:
    Unity UGUI的RawImage(原始图片)组件的介绍及使用
    闲置电脑挂机赚钱-Traffmonetizer,支持windows,linux,Android,MacOS多平台
    设计模型之六大原则(有的地方称之为七大原则)
    富婆富少都爱看的ACL基本配置及实验详解
    什么情况下考虑分库分表
    WMS系统4.0,仓库管理的20年历史变局你知道吗?
    高并发下的网络 IO 模型设计
    美妆穿搭带货直播稿 话术 脚本
    AI入门指南(二):算法、训练、模型、大模型是什么?
    NLP常见任务的分类指标
  • 原文地址:https://blog.csdn.net/MinggeQingchun/article/details/126347932