kubernetes 简称k8s, 因为k和s 中间有'ubernete' 8个单词,所以简称k8s。是一个开源的,用于管理云平台中多个主机上的容器化的应用, k8s 的目标是让部署容器化的应用简单并且高效,k8s 提供了应用部署、规划、更新、维护的一种机制。是google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。
它有三个关键的组件:kubelet, kubeadm, kubectl
其中:
kubeadm : 是用来搞集群的,比如初始化 master 节点,添加 work 节
kubelet : 简单说就是master 派到node 节点的代表,管理本机容器的相关 *** 作。负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
kubectl : 是执行各种查询和控制类 *** 作的
这里再写几个其他的概念:
etcd:存储系统,用于保存集群相关的数据,比如说状态数据、pod数据等,注意pod可以分为2类,一种是普通的pod,这种pod会将自己的相关信息存储到etcd,这样管理节点就可以知道有哪些pod,还有一种是静态pod它们会将自己的信息存储到自己所在的节点的存储文件里,这样一来管理节点就不知道它们的存在,所以他们的启动停止等 *** 作,就只能靠人工去相应的节点上去手动 *** 作了。
apiserver:资源 *** 作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制,以restful 方式,交给etcd 存储
scheduler:节点调度,选择node 节点应用部署;按照预定的调度策略将Pod调度到相应的机器上
controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等,一个资源对应一个控制器
kube-proxy:网络上的代理,包括负载均衡等 *** 作。负责为Service提供cluster内部的服务发现和负载均衡
pod:k8s部署的最小单元,一个pod 可以包含多个容器,也就是一组容器的集合;容器内部共享网络;pod 的生命周期是短暂的,重新部署之后是一个新的pod,pod是K8s集群中所有业务类型的基础,可以看作运行在K8s集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前K8s中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的小机器人控制器为Deployment、Job、DaemonSet和PetSet
Replication Controller :RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod
Service:定义一组pod 的访问规则。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。
ok,接下来,看下k8s部署集群的公共 *** 作(不管是部署master节点,还是work节点,都需要先完成这些 *** 作)
1、关闭selinux
vi /etc/selinux/config # 永久关闭
将参数 SELINUX 改为 disabled 即可
2、注释掉交换分区
vi /etc/fstab
将交换分区那一行注掉
执行swapoff -a 暂时关闭这个文件
3、修改网卡配置(由于集群中肯定存在流量转发的问题,所以需要修改网卡)
vi /etc/sysctl.conf
将如下三行搞进去:
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
保存退出后,执行 sysctl -p 来应用它
4、启用内核模块
vi /etc/sysconfig/modules/ipvs.modules
添加如下内容:
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
完成后,其并不会立刻生效,需要执行一下命令,让其临时生效:
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
5、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
6、配置 hosts
编辑源的配置文件
vi /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
安装 kubelet, kubeadm, kubectl:
yum install -y kubelet kubeadm kubectl
启动 kubelet 服务:
systemctl enable kubelet
systemctl start kubelet
systemctl status kubelet # 这里会有255的错,这个错属于正常,后面会解决
执行命令 journalctl -xe 可以查看具体报错信息
后续会创建这个配置文件,所以暂时不管。
安装 docker,可以去官网上看下流程:
https://docs.docker.com/engine/install/
这里以cetos为例:
1、先卸载以前的版本,如果之前没安过,直接跳过
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、Set up the repository
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3、下载docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
4、启动docker
sudo systemctl start docker
5、查看状态
systemctl status docker
docker version
接下来修改docker配置:
1、查看docker驱动
docker info | grep -i cgroup
k8s默认的docker驱动为systemd,所以需要修改驱动
2、修改驱动
vi /etc/docker/daemon.json
将下面的东西添加进去:
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
完成以后重启docker服务:
systemctl restart docker
再看驱动: docker info | grep -i cgroup
接下来需要下载k8s所需要的一些镜像文件:
1、查看需要下载哪些镜像:
kubeadm config images list
2、下载这些镜像,由于网络原因,我们需要用docker去找docker hub中等效的镜像,将其下载下来,完成后使用docker tag 命令将docker下载下的镜像名称换成上面所需要的k8s的镜像名称,然后再删除docker名称的那些原始镜像。
https://hub.docker.com/
在上面搜索所需同名镜像:
执行命令: docker pull kubeimage/kube-apiserver-amd64
完成后,查看镜像: docker images
然后修改tag: docker tag xxx xxx 再次查看: docker images
删除多余镜像,并查看结果:
然后,这就可以了,剩下的镜像,按照流程替换即可。
以上就是所有集群化配置的公共内容了。
Master 节点的配置:
假如是做测试,在pc上搞三个虚拟机做为节点的话,上面的 *** 作可以在一个虚拟机上进行,完成后复制2份即可,但是会有一个问题,复制的虚拟机的 ip 地址也是完全相同的,所以需要将后面的复制品的 IP 进行更改。
这里分享一个改虚拟机 ip 的 方法:
首先:
ip addr # 查看 ip
所以这里就需要改2个地方的 ip
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
换掉这个值就行,同一个机子,这个值应该是统一的。
注意,完事后记着重启网络服务:systemctl restart network
另外,对于后面的2个虚拟机还需要设定其主机名称,方法为:
cat /etc/hostname # 查看主机名
hostnamectl set-hostname xxx # 修改主机名
这里再提一嘴,往往可以 ping 主机名 就可以找到具体的 ip,那是因为在配置文件里已经有了相应的映射配置,所以才可以ping通,这里添加一个修改这个映射的方法:
vi /etc/hosts # 在这修改,将新的 ip 与 主机名映射添加进去即可
master节点初始化之前还需要对 pod-network-cidr 这个参数做一些准备工作,就是选择合适的插件。
https://kubernetes.io/zh/docs/concepts/cluster-administration/addons/
可以在这个网站上查看,都有哪些网络插件可用。
然后,选择你想用的插件,点中去查看,例如:
进去一后往下拉,看这里:
将这个url在浏览器中打开,搜 network,就可以找到网络取值范围:
然后将这个值给到,master节点的 pod-network-cidr 这个参数。所以说这个参数不是随便给的,也是精挑细选,选出来的。
然后就可以执行master节点的创建工作了。
kubeadm init --apiserver-advertise-address=192.168.13.103 --kubernetes-version v1.18.0 --pod-network-cidr=10.244.0.0/16
其中参数:
--pod-network-cidr 指pod的网络范围,不同的插件对应的范围不同,所以在给值的时候要注意
--kubernetes-version 就是k8s的版本默认是最新版,当然如果用的不是最新版,就最好指定一下
--apiserver-advertise-address 这是master机子所在节点的 ip 地址
如果在初始化过程中,失败了,那么肯定先找失败的原因,解决掉以后,需要重新还原配置,命令为:kubeadm reset
执行完命令后,这里会有个这个文件,在这里可以修改这个文件,因为我们有将主机名和ip绑定,所以,可以将这个文件中的 ip 地址换成主机名,然后,就可以通过主机名访问各个服务了。
编辑这个文件:
将它换掉:
然后,按照执行完初始化master的命令中的提示,继续即可。
然后查看下命名空间:kubectl get pods --all-namespaces
这里会发现有2个pod处于等待态。这是由于初始化参数 pod-network-cidr 我们给了参数,但是并没有进行相应的配置。还记着上面截图中,我们圈出来的命令么,这里,我们执行一下,将插件的配置文件使用起来。
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
执行完成之后,会发现这里多了一个pod
然后也可以通过命令去查看这个pod到底什么情况:
kubectl describe pods xxx(pod-name) -n xxx(namespece)
现在再看,它就好了
然后,master节点就ok了,接下来,我们需要生成一个将work节点添加到master节点的命令。
kubectl token create --print-join-command
work 节点的配置:
基础的相关配置和上面差不多,都需要改 ip,改主机名,改 hosts 映射,完成后,就只需要执行,在master节点上创建的 join-command 命令即可,就是上面那个,复制粘贴到work节点就完事了。
在master节点看下结果,一切ok
服务部署:
其实,服务的部署,只有一个命令就可以了,重点是得有部署服务的 yml 文件,这属于k8s的yml文件。
类似于这样的:
然后,基于这个配置文件,就可以直接使用命令部署了。
kubectl apply -f xxx.yml
直接就可以完成部署了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)