docker与kubernetes

版权声明:转载请著明出处 https://blog.csdn.net/weixin_40543283/article/details/88823473

以下简介内容来自

https://www.cnblogs.com/menkeyi/p/7134460.html

部署内容不是

一、kubernetes

1.核心概念

1)Node

Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的Kubelet、kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁、以及实现软件模式的负载均衡。

Node包含的信息:

  • Node地址:主机的IP地址,或Node ID。
  • Node的运行状态:Pending、Running、Terminated三种状态。
  • Node Condition:…
  • Node系统容量:描述Node可用的系统资源,包括CPU、内存、最大可调度Pod数量等。
  • 其他:内核版本号、Kubernetes版本等。

查看Node信息:

kubectl describe node

2)Pod

Pod是Kubernetes最基本的操作单元,包含一个或多个紧密相关的容器,一个Pod可以被一个容器化的环境看作应用层的“逻辑宿主机”;一个Pod中的多个容器应用通常是紧密耦合的,Pod在Node上被创建、启动或者销毁;每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。

同一个Pod里的容器之间仅需通过localhost就能互相通信。

一个Pod中的应用容器共享同一组资源:

  • PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID;
  • 网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围;
  • IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信;
  • UTS命名空间:Pod中的多个容器共享一个主机名;
  • Volumes(共享存储卷):Pod中的各个容器可以访问在Pod级别定义的Volumes;

Pod的生命周期通过Replication Controller来管理;通过模板进行定义,然后分配到一个Node上运行,在Pod所包含容器运行结束后,Pod结束。

Kubernetes为Pod设计了一套独特的网络配置,包括:为每个Pod分配一个IP地址,使用Pod名作为容器间通信的主机名等。

3)Service

在Kubernetes的世界里,虽然每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失,这就引出一个问题:如果有一组Pod组成一个集群来提供服务,那么如何来访问它呢?Service!

一个Service可以看作一组提供相同服务的Pod的对外访问接口,Service作用于哪些Pod是通过Label Selector来定义的。

  • 拥有一个指定的名字(比如my-mysql-server);
  • 拥有一个虚拟IP(Cluster IP、Service IP或VIP)和端口号,销毁之前不会改变,只能内网访问;
  • 能够提供某种远程服务能力;
  • 被映射到了提供这种服务能力的一组容器应用上;

如果Service要提供外网服务,需指定公共IP和NodePort,或外部负载均衡器;

NodePort 
系统会在Kubernetes集群中的每个Node上打开一个主机的真实端口,这样,能够访问Node的客户端就能通过这个端口访问到内部的Service了

4)Volume

Volume是Pod中能够被多个容器访问的共享目录。

5)Label

Label以key/value的形式附加到各种对象上,如Pod、Service、RC、Node等,以识别这些对象,管理关联关系等,如Service和Pod的关联关系。

6)RC(Replication Controller)

  • 目标Pod的定义;
  • 目标Pod需要运行的副本数量;
  • 要监控的目标Pod标签(Lable);

Kubernetes通过RC中定义的Lable筛选出对应的Pod实例,并实时监控其状态和数量,如果实例数量少于定义的副本数量(Replicas),则会根据RC中定义的Pod模板来创建一个新的Pod,然后将此Pod调度到合适的Node上启动运行,直到Pod实例数量达到预定目标。

2.Kubernetes总体架构

Master和Node

Kubernetes将集群中的机器划分为一个Master节点和一群工作节点(Node)。其中,Master节点上运行着集群管理相关的一组进程etcd、API Server、Controller Manager、Scheduler,后三个组件构成了Kubernetes的总控中心,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且全都是自动完成。在每个Node上运行Kubelet、Proxy、Docker daemon三个组件,负责对本节点上的Pod的生命周期进行管理,以及实现服务代理的功能。

流程 
通过Kubectl提交一个创建RC的请求,该请求通过API Server被写入etcd中,此时Controller Manager通过API Server的监听资源变化的接口监听到这个RC事件,分析之后,发现当前集群中还没有它所对应的Pod实例,于是根据RC里的Pod模板定义生成一个Pod对象,通过API Server写入etcd,接下来,此事件被Scheduler发现,它立即执行一个复杂的调度流程,为这个新Pod选定一个落户的Node,然后通过API Server讲这一结果写入到etcd中,随后,目标Node上运行的Kubelet进程通过API Server监测到这个“新生的”Pod,并按照它的定义,启动该Pod并任劳任怨地负责它的下半生,直到Pod的生命结束。

随后,我们通过Kubectl提交一个新的映射到该Pod的Service的创建请求,Controller Manager会通过Label标签查询到相关联的Pod实例,然后生成Service的Endpoints信息,并通过API Server写入到etcd中,接下来,所有Node上运行的Proxy进程通过API Server查询并监听Service对象与其对应的Endpoints信息,建立一个软件方式的负载均衡器来实现Service访问到后端Pod的流量转发功能。

  • etcd 
    用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。

  • API Server 
    提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。

  • Controller Manager 
    集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。

  • Scheduler 
    集群中的调度器,负责Pod在集群节点中的调度分配。

  • Kubelet 
    负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。

  • Proxy 
    实现了Service的代理与软件模式的负载均衡器。

客户端通过Kubectl命令行工具或Kubectl Proxy来访问Kubernetes系统,在Kubernetes集群内部的客户端可以直接使用Kuberctl命令管理集群。Kubectl Proxy是API Server的一个反向代理,在Kubernetes集群外部的客户端可以通过Kubernetes Proxy来访问API Server。

API Server内部有一套完备的安全机制,包括认证、授权和准入控制等相关模块。

二、部署Kubernetes

环境:

           docker1:rhel7,docker

           docker2:rhel7,docker

           docker3:rhel7,docker

           软件:k8s  ==>  点击下载   提取码: qm9i

1.安装Kubernetes安装包

docker1,docker2和docker3都需要安装

[root@docker1 ~]# cd k8s/
[root@docker1 k8s]# yum install -y kubeadm-1.12.2-0.x86_64.rpm kubelet-1.12.2-0.x86_64.rpm kubectl-1.12.2-0.x86_64.rpm kubernetes-cni-0.6.0-0.x86_64.rpm cri-tools-1.12.0-0.x86_64.rpm 

 2.禁用swap分区,并禁止swap分区开机自动挂载

docker1,docker2和docker3都需要进行操作

[root@docker1 k8s]# swapoff -a
[root@docker1 k8s]# vim /etc/fstab                     ##注释掉挂载的swap分区,如下图
[root@docker1 k8s]# systemctl enable kubelet.service   ##设置为开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /etc/systemd/system/kubelet.service.
[root@docker1 k8s]# systemctl start kubelet

而此时k8s并没有真正的启动起来,我们还需要进行接下来的操作才可以

3.导入镜像

kaidocker1,docker2和docker3都需要进行操作

[root@docker1 k8s]# docker load -i kube-apiserver.tar 
8a788232037e: Loading layer   1.37MB/1.37MB
507564533658: Loading layer  192.8MB/192.8MB
Loaded image: k8s.gcr.io/kube-apiserver:v1.12.2
[root@docker1 k8s]# docker load -i kube-controller-manager.tar 
0faf148c8565: Loading layer    163MB/163MB
Loaded image: k8s.gcr.io/kube-controller-manager:v1.12.2
[root@docker1 k8s]# docker load -i kube-scheduler.tar 
0d5e977176bb: Loading layer  57.19MB/57.19MB
Loaded image: k8s.gcr.io/kube-scheduler:v1.12.2
[root@docker1 k8s]# docker load -i kube-proxy.tar 
0c1604b64aed: Loading layer   44.6MB/44.6MB
dc6f419d40a2: Loading layer  3.407MB/3.407MB
2d9b7a4a23dd: Loading layer  50.33MB/50.33MB
Loaded image: k8s.gcr.io/kube-proxy:v1.12.2
[root@docker1 k8s]# docker load -i pause.tar 
e17133b79956: Loading layer  744.4kB/744.4kB
Loaded image: k8s.gcr.io/pause:3.1
[root@docker1 k8s]# docker load -i etcd.tar 
f9d9e4e6e2f0: Loading layer  1.378MB/1.378MB
7882cc107ed3: Loading layer  195.1MB/195.1MB
43f7b6974634: Loading layer  23.45MB/23.45MB
Loaded image: k8s.gcr.io/etcd:3.2.24
[root@docker1 k8s]# docker load -i coredns.tar 
9198eadacc0a: Loading layer  542.2kB/542.2kB
9949e50e3468: Loading layer  38.94MB/38.94MB
Loaded image: k8s.gcr.io/coredns:1.2.2
[root@docker1 k8s]# docker load -i flannel.tar
cd7100a72410: Loading layer  4.403MB/4.403MB
3b6c03b8ad66: Loading layer  4.385MB/4.385MB
93b0fa7f0802: Loading layer  158.2kB/158.2kB
4165b2148f36: Loading layer  36.33MB/36.33MB
b883fd48bb96: Loading layer   5.12kB/5.12kB
Loaded image: quay.io/coreos/flannel:v0.10.0-amd64

4.初始化k8s

[root@docker1 k8s]# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.25.1.1

 上述指令的网址可以在kube-flannel.yml文件里面找到

插播,我们可以进行如下操作,使我们使用k8s可以进行一个补全操作

[k8s@docker1 ~]$ vim ./.bashrc             ##最后一行添加如下
source <(kubectl complrtion bash)

5.添加节点

docker1

[root@docker1 k8s]# useradd k8s
[root@docker1 k8s]# vim /etc/sudoers                ##添加如下图

[root@docker1 k8s]# su - k8s 
[root@docker1 k8s]# mkdir -p $HOME/.kube
[root@docker1 k8s]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@docker1 k8s]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@docker1 k8s]# cp kube-flannel.yml /home/k8s/        ##拷贝配置文件到k8s的家目录
[root@docker1 k8s]# su - k8s
[k8s@docker1 ~]$ kubectl apply -f kube-flannel.yml 
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created

docker2和docker3

[root@docker1 ~]# kubeadm join 172.25.1.1:6443 --token n54dq5.9i4d4b7cxpcvwedg --discovery-token-ca-cert-hash sha256:ffb260bb049deb78ed0f508bc595a1df958a6a8ad05776f0be87b7eb9acf4583

问题1:在这里我出现了一个问题,如下

[root@k8s3 k8s]# kubeadm join 172.25.1.1:6443 --token 0pqrew.6biucbk5ci5r8aw4 --discovery-token-ca-cert-hash sha256:eaaac7989ae7349cb6a749d72930cc175d56ac469b3d7e0ffa0de889df7d446e
W0326 23:35:31.037968    4320 common.go:168] WARNING: could not obtain a bind address for the API Server: no default routes found in "/proc/net/route" or "/proc/net/ipv6_route"; using: 0.0.0.0
cannot use "0.0.0.0" as the bind address for the API Server

后来发现是由于没有设置网关,设置完我的网关之后,重启成功的设置了,成功截图如下

问题2:当我查看k8s节点信息的时候,又出现了一个问题

[root@k8s3 ~]# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?

解决方法如下:

首先将admin.conf文件拷贝到docker2和docker3节点的相同目录下

[root@k8s1 docker1]# scp admin.conf [email protected]:/etc/kubernetes/

然后对docker2和docker3做下述操作

[root@docker2 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@docker2 ~]# source ~/.bash_profile

还有可能会出现一种情况是,出现下属的warning

[WARNING RequiredIPVSKernelModulesAvailable]: the IPVS proxier will not be used, because the following required kernel modules are not loaded: [ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh] or no builtin kernel ipvs support: map[ip_vs_wrr:{} ip_vs_sh:{} nf_conntrack_ipv4:{} ip_vs:{} ip_vs_rr:{}]
you can solve this problem with following methods:
 1. Run 'modprobe -- ' to load missing kernel modules;
2. Provide the missing builtin kernel ipvs support

可以通过以下命令解决

[root@docker2 ~]# modprobe ip_vs_wrr
[root@docker2 ~]# modprobe ip_vs_sh

6.查看

[root@k8s1 k8s]# kubectl get nodes
NAME   STATUS   ROLES    AGE   VERSION
k8s1   Ready    master   33m   v1.12.2
k8s2   Ready    <none>   29m   v1.12.2
k8s3   Ready    <none>   29m   v1.12.2

查看namespaces设置

[root@k8s1 k8s]# kubectl get pod --all-namespaces
NAMESPACE     NAME                           READY   STATUS    RESTARTS   AGE
kube-system   coredns-576cbf47c7-8tbjh       1/1     Running   0          35m
kube-system   coredns-576cbf47c7-nwcbn       1/1     Running   0          35m
kube-system   etcd-k8s1                      1/1     Running   0          34m
kube-system   kube-apiserver-k8s1            1/1     Running   0          34m
kube-system   kube-controller-manager-k8s1   1/1     Running   1          34m
kube-system   kube-flannel-ds-amd64-bxhwv    1/1     Running   0          31m
kube-system   kube-flannel-ds-amd64-nxpkm    1/1     Running   0          31m
kube-system   kube-flannel-ds-amd64-p52x6    1/1     Running   0          33m
kube-system   kube-proxy-frqzv               1/1     Running   0          31m
kube-system   kube-proxy-hff6c               1/1     Running   0          31m
kube-system   kube-proxy-wsvxt               1/1     Running   0          35m
kube-system   kube-scheduler-k8s1            1/1     Running   1          34m

ok~

猜你喜欢

转载自blog.csdn.net/weixin_40543283/article/details/88823473