docker 与 k8s

docker 与 k8s,第1张

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

直接就可以完成部署了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/916873.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存