开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2023.04.28江苏
在部署应用程序的方式上,主要经历了三个时代:
容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:
这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件:
kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。
kubernetes官网
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
一个kubernetes集群主要是由控制节点(master,做管理)、工作节点(node)构成,每个节点上都会安装不同的组件。
master:集群的控制平面,负责集群的决策(集群管理者)
Scheduler:负责集群资源调度(计算),按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager:负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
Etcd:负责存储集群中各种资源对象的信息(默认使用etcd,也可以手动改为mysql等)
node:集群的数据平面,负责为容器提供运行环境(真正干活)
Kubelet:负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
KubeProxy:负责提供集群内部的服务发现和负载均衡(访问k8s里程序的入口,例如他可以提供访问linux的入口)
Docker:负责节点上容器的各种操作
下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:
这样,外界用户就可以访问集群中的nginx服务了
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境(默认pod之间是可以相互访问的,有了Namspace后,可以控制pod之间是否能访问)
为了测试方便,本次搭建的是一主多从类型的集群。
kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包。
●minikube:一个用于快速搭建单节点的kubernetes工具。●kubeadm:一个用于快速搭建kubernetes集群的工具。●二进制包:从官网上下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效。
我们需要安装kubernetes的集群环境,但是又不想过于麻烦,所以选择kubeadm方式
本次环境搭建需要三台CentOS服务器(一主二从),然后在每台服务器中分别安装Docker(18.06.3)、kubeadm(1.18.0)、kubectl(1.18.0)和kubelet(1.18.0)。
没有特殊说明,就是三台机器都需要执行。
配置虚拟机IP与主机名
DNS地址使用阿里的地址即可
检查操作系统的版本(要求操作系统的版本至少在7.5以上)
生产环境不能这么干,只打开使用的端口即可
关闭防火墙:
systemctlstopfirewalld禁止防火墙开机启动:
设置主机名语法
hostnamectlset-hostname
hostnamectlset-hostnamemaster设置192.168.18.101的主机名
hostnamectlset-hostnamenode1设置192.168.18.102的主机名
hostnamectlset-hostnamenode22.2.2.4主机名解析为了方便后面集群节点间的直接调用,需要配置一下主机名解析,企业中推荐使用内部的DNS服务器里配置。
直接执行这俩命令:
systemctlstartchronydsystemctlenablechronyd或者执行下边这俩命令也行:
yuminstallntpdate-yntpdatetime.windows.com2.2.2.6关闭selinuxselinux是linux下的安全服务,如果不关闭,在安装集群中会产生各种问题
查看selinux是否开启
getenforce永久关闭selinux,需要重启
永久关闭swap分区,需要重启
在每个节点上将桥接的IPv4流量传递到iptables的链
cat>/etc/sysctl.d/k8s.conf< yum-yinstallipsetipvsadm# 或者yuminstallipsetipvsadmin-y在所有节点执行如下脚本:添加需要的模块写入脚本文件(直接复制下边的命令回车即刻) chmod755/etc/sysconfig/modules/ipvs.modules执行脚本 /bin/bash/etc/sysconfig/modules/ipvs.modules检查是否加载: lsmod|grep-eipvs-enf_conntrack_ipv42.2.2.10重启三台机器重启三台Linux机器: 启动docker systemctlstartdocker#设置开机启动dockersystemctlenabledocker查看docker版本 yuminstall-ykubelet-1.18.0kubeadm-1.18.0kubectl-1.18.0为了实现Docker使用的cgroupdrvier和kubelet使用的cgroupdrver一致,建议修改"/etc/sysconfig/kubelet"文件的内容: vim/etc/sysconfig/kubelet#修改KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"KUBE_PROXY_MODE="ipvs"设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动: systemctlenablekubelet8完 查看k8s所需镜像: 部署k8s的Master节点(192.168.18.100): 情况二:如果之前没有下载好镜像,可以使用下边命令在线下载安装master 根据提示,在192.168.18.101和192.168.18.102上添加如下的命令: 默认的token有效期为24小时,当过期之后,该token就不能用了,这时可以使用如下的命令创建token: kubeadmtokencreate--print-join-command#生成一个永不过期的tokenkubeadmtokencreate--ttl0--print-join-command2.2.7部署CNI网络插件根据提示,在Master节点上使用kubectl工具查看节点状态: 使用配置文件启动flannel: 在Kubernetes集群中部署一个Nginx程序,测试下集群是否正常工作。 部署Nginx:(在master操作即可) kubectlcreatedeploymentnginx--image=nginx:1.14-alpine暴露端口: #NodePort:集群外的浏览器可以访问kubectlexposedeploymentnginx--port=80--type=NodePort查看服务状态: yuminstall-ybash-completionsource/usr/share/bash-completion/bash_completionsource<(kubectlcompletionbash)echo“source<(kubectlcompletionbash)”>>~/.bashrcvim/root/.bashrcsource/usr/share/bash-completion/bash_completionsource<(kubectlcompletionbash)二kubernetes集群环境搭建2.1前置知识点目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadminit和kubeadmjoin,用于快速部署Kubernetes集群。 二进制包 从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。 Kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署: 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: docker-ce.repo kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。 kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。 Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。 当然,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统。 学习kubernetes的核心,就是学习如何对集群上的Pod、Pod控制器、Service、存储等各种资源进行操作 YAML是一个类似XML、JSON的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。 xml: heima:age:15address:BeijingYAML的语法比较简单,主要有下面几个: YAML支持以下几种数据类型: 1书写yaml切记:后面要加一个空格 2如果需要将多段yaml配置放在一个文件中,中间要使用---分隔 3下面是一个yaml转json的网站,可以通过它验证yaml是否书写正确 下边是三种创建pod的方式 kubectl命令 kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下: kubectl[command][type][name][flags]comand:指定要对资源执行的操作,例如create、get、delete,可以通过kubectl--help命令查看所有命令 type:指定资源类型,比如deployment、pod、service name:指定资源的名称,名称大小写敏感 flags:指定额外的可选参数 操作(comand类型) kubernetes允许对资源进行多种操作,可以通过–help查看详细的操作命令 kubectl--help经常使用的操作有下面这些: 资源类型(type) kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看: kubectlapi-resources经常使用的资源有下面这些: 下面以一个namespace/pod的创建和删除简单演示下命令的使用: #创建一个namespace名称叫devnamespace可以简写为ns[root@master~]#kubectlcreatenamespacedevnamespace/devcreated#获取namespace[root@master~]#kubectlgetns除了dev,其他是k8s集群自带的NAMESTATUSAGEdefaultActive21hdevActive21skube-node-leaseActive21hkube-publicActive21hkube-systemActive21h#在此namespace下创建并运行一个nginx的Pod[root@master~]#kubectlrunpod--image=nginx:latest-ndevkubectlrun--generator=deployment/apps.v1isDEPRECATEDandwillberemovedinafutureversion.Usekubectlrun--generator=run-pod/v1orkubectlcreateinstead.deployment.apps/podcreated#查看新创建的pod,默认查询default的namespace下的pod[root@master~]#kubectlgetpod-ndevNAMEREADYSTATUSRESTARTSAGEpod1/1Running021s#删除指定ns下的的指定pod[root@master~]#kubectldeletepodspod-864f9875b9-pcw7x-ndevpod"pod"deleted#删除指定的namespace[root@master~]#kubectldeletensdevnamespace"dev"deleted3.3.2命令式对象配置命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。 1)创建一个nginxpod.yaml,内容如下: #创建名字是dev的namespaceapiVersion:v1kind:Namespacemetadata:name:dev#yml文件里,要写两个名字一样的配置的话,需要使用---做分割---#在dev下创建一个pod,pod名字是nginxpod,镜像以及镜像版本是nginx:1.17.1apiVersion:v1kind:Podmetadata:name:nginxpodnamespace:devspec:containers:-name:nginx-containersimage:nginx:1.17.12)执行create命令,创建资源: [root@master~]#kubectlcreate-fnginxpod.yamlnamespace/devcreatedpod/nginxpodcreated此时发现创建了两个资源对象,分别是namespace和pod 查看名字是dev的namespace kubectlgetnsdev查看dev下的pod 3)执行get命令,查看资源: [root@master~]#kubectlget-fnginxpod.yamlNAMESTATUSAGEnamespace/devActive18sNAMEREADYSTATUSRESTARTSAGEpod/nginxpod1/1Running017s这样就显示了两个资源对象的信息 4)执行delete命令,删除资源: [root@master~]#kubectldelete-fnginxpod.yamlnamespace"dev"deletedpod"nginxpod"deleted此时发现两个资源对象被删除了 kubectl的运行是需要进行配置的,它的配置文件是在master节点下的$HOME/.kube,如果想要在node节点运行此命令,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作: scp-rHOME/.kubenode1:HOME/使用推荐:三种方式应该怎么用 删除资源使用命令式对象配置kubectldelete-fXXX.yaml 查询资源使用命令式对象管理kubectlget(describe)资源名称