Kubernetes

what is kubernetes?

         Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

        Kubernetes这个词起源于古希腊,是舵手的意思。而它的logo非常像一个“船舵”。kubernetes是第一个将“一切以服务为中心,一切围绕服务运转”作为指导思想的产品。构建kubernetes上的系统不进可以独立运行在物理机、虚拟机集群或者私有云上以及托管在公有云中。kubernetes方案另一个特点是自动化,如一个服务可以自我扩展、自我诊断,并且容易升级,在收到服务扩容的请求后,kubernetes会触发调度流程,最终在选定目标节点上启动相应数量的服务实例副本,这些副本在启动成功后会自动加入负载均衡器中并生效,整个过程无须额外人工操作。

        通常把kubernetes看作docker的上层架构,kubernetes以docker为基础打造了一个云计算时代的全新分布式系统架构。kubernetes架构中不仅仅只支持docker一种容器,还支持另一种容器技术Rocket。

kubernetes特性:

  • 自动装箱、自我修复、水平扩展,服务发现和负载均衡,自动发布和回滚

  • 密钥和配置管理,存储编排,批量处理执行

kubernetes核心术语:

pod、 label, service, ingress..

kubernetes架构:

2019-03-29_152515.jpg


Kubernetes主要由以下几个核心组件组成:

Master:

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

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

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

  • etcd保存了整个集群的状态;

Node:

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

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

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

Kubernetes安装

kubernet安装方式一:

1、针对于master节点

将API Server、etcd、controller-manager、scheduler各组件进行yum install、编译安装或者展开安装的方式手动直接安装在master节点主机上,作为系统级守护进程运行。

2、针对于node节点

将kube-proxy、kubelet、docker、flannel各组件进行yum install或下载已预制好的二进制程序包手动安装在node节点主机上,作为系统级守护进程运行。

此部署方式非常的“繁琐”,出于安全方面的考虑,各组件之间通信都需要配置CA和证书。

注:此部署方式的缺点就是如果master宕机了,需要手动进行启动这些系统级的守护进程

源码包获取地址:https://github.com/kubernetes/kubernetes/releases

2019-03-29_235205.jpg

2019-03-29_235250.jpg

kubernet安装方式二:

通过k8s官方所提供的专门部署集群的管理工具kubeadm进行安装。

每一个节点主机上包括master节点都要手动安装并运行docker,同时也都要手动安装并运行kubelet。如果将第一个节点初始化为master节点,在执行初始化这个步骤,其实就是通过kubeadm工具将API Server、etcd、controller-manager、scheduler各组件运行为Pod,也就是跑在docker上。而其他node节点,因已经运行了kubelet、docker组件,剩下的kube-proxy组件也是要运行在Pod上。

kubelet:负责能运行Pod化容器的核心组件

docker:运行容器的引擎

但是以上master节点上的Pod都是静态Pod(static Pod),并不受k8s自身管理,只是运行为Pod形式而已,也可运行为自托管Pod。

2019-03-31_150325.jpg

flannel组件也是运行在Pod上的系统级守护进程,起到各node节点通信作用。

kubernetes相关资料:

kubeadm资料:https://github.com/kubernetes/kubeadm

前提条件

1、各主机基于主机名进行通信:/etc/hosts

如:

[root@centos7 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.137.100 centos7 
192.168.137.201 centos7-1 
192.168.137.202 centeos7-2

2、时间同步

3、保持firewalld和iptables.service关闭

安装环境

2019-03-30_160508.jpg

网络结构图:

2019-03-31_151846.jpg

基于阿里yum源进行Kubernetes集群安装

一.在主机名centos7(master)安装

下载docker源:

[root@centos7 yum.repos.d]#wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

配置kubernetes源:

    这里使用阿里云提供的yum源:

[root@centos7 ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1

    检查yum源是否正常:

2019-03-29_235951.jpg

    将配置好的kubernetesYum源和dockerYum源下发到node节点上:

[root@centos7 ~]# ansible slave -m copy -a 'src=/etc/yum.repos.d/kubernetes.repo dest=/etc/yum.repos.d/kubernetes.repo'
[root@centos7 ~]# ansible slave -m copy -a 'src=/etc/yum.repos.d/docker.repo dest=/etc/yum.repos.d/docker.repo'

    master节点上安装docker及kubernetes程序包:

[root@centos7 ~]# yum install docker-ce kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 kubernetes-cni-0.6.0

2019-03-30_160342.jpg

启动docker

注意:以下只限于本地网络可以访问google环境下

    启动docker时,docker需要去镜像仓库下载每一个所依赖的镜像文件,这些镜像文件暂时获取不到,建议将相关镜像文件通过其他途径下载到本地然后导入使用,或者推送到本地仓库。

    在这里我们是借用别人此前提供的一种路径来获取并下载使用,因此在启动之前,需要编辑vim /usr/lib/systemd/system/docker.service,在该文件中定义一个环境变量

[root@centos7 ~]# vim /usr/lib/systemd/system/docker.service

2019-03-29_181825.jpg

重新启动,使配置生效:

[root@centos7 ~]# systemctl daemon-reload  #修改了的unit文件,要通知systemd重载此配置文件
[root@centos7 ~]# systemctl start docker

在启动docker时发现报错,报错信息为:"Error starting daemon: Error initializing network controller: Error c.."

解决方法:rm -rf /var/lib/docker/network/files/* 重新启动即可。

通过docker info查看状态,会显示代理信息。

2019-03-30_001014.jpg

kubernetes网络依赖:

同时还要确保以下两个参数值为1。通过网桥转发的IP数据包会iptables规则过滤,而这两个选项将阻止过滤,Netfilter是默认情况下启用了桥梁,如果不阻止会导致严重的混乱。

2019-03-29_214356.jpg

通过rpm -ql查看安装完成之后生成的文件:

[root@centos7 ~]# rpm -ql kubelet
/etc/kubernetes/manifests    #清单目录
/etc/sysconfig/kubelet        #配置文件
/usr/bin/kubelet
/usr/lib/systemd/system/kubelet.service

设定docker和kubelet系统默认启动:

[root@centos7 ~]# systemctl enable docker
[root@centos7 ~]# systemctl enable kubelet

然后,通过kubeadm init命令初始化即可完成集群安装。

由于我的本地网络不能访问google,可以从docker镜像仓库中pull下kubernetes的版本为v1.12.2组件镜像文件:

首先设定docker镜像加速器,方便下载镜像:

[root@centos7:/root]
# vim /etc/docker/daemon.json
 {
      "registry-mirrors" : ["https://registry.docker-cn.com"]
 }

从docker镜像仓库中拉取镜像文件:

[root@centos7 ~]# docker pull mirrorgooglecontainers/kube-apiserver:v1.13.3
[root@centos7 ~]# docker pull mirrorgooglecontainers/kube-controller-manager:v1.13.3
[root@centos7 ~]# docker pull mirrorgooglecontainers/kube-scheduler:v1.13.3
[root@centos7 ~]# docker pull mirrorgooglecontainers/kube-proxy:v1.13.3
[root@centos7 ~]# docker pull mirrorgooglecontainers/pause:3.1
[root@centos7 ~]# docker pull mirrorgooglecontainers/etcd:3.2.24
[root@centos7 ~]# docker pull coredns/coredns:1.2.6

2019-03-30_161430.jpg

mirrorgooglecontainers/pause为基础架构容器,可以不用启动,其他容器可以将它当成模板进行网络、存储卷复制。

mirrorgooglecontainers/kube-proxy 作为附件运行自托管与k8s之上,来帮忙负责生成service资源相关的iptables或者ipvs规则,在1.11版本默认使用ipvs。

将拉取下的镜像tag更新为Kubeadm初始化时所能识别的标签镜像:

[root@centos7 ~]# docker tag mirrorgooglecontainers/kube-apiserver:v1.13.3 k8s.gcr.io/kube-apiserver:v1.13.3
[root@centos7 ~]# docker tag mirrorgooglecontainers/kube-controller-manager:v1.13.3 k8s.gcr.io/kube-controller-manager:v1.13.3
[root@centos7 ~]# docker tag mirrorgooglecontainers/kube-scheduler:v1.13.3 k8s.gcr.io/kube-scheduler:v1.13.3
[root@centos7 ~]# docker tag mirrorgooglecontainers/kube-proxy:v1.13.3 k8s.gcr.io/kube-proxy:v1.13.3
[root@centos7 ~]# docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
[root@centos7 ~]# docker tag mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
[root@centos7 ~]# docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6

初始化kubernetes:

[root@centos7 ~]# kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

    --kubernetes-verison:指定初始化版本,默认是1.11.0

    --pod-network-cidr:指定pod网络的IP地址范围。如果设置,控制平面将为每个节点自动分配CIDRs。

    --service-cidr:为service VIPs使用不同的IP地址。(默认“10.96.0.0/12”)

初始化时,报错:

2019-03-30_163136.jpg

1)编辑配置文件:

[root@centos7 ~]# vim /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS="--fail-swap-on=false"

2)在初始化指定:

--ignore-preflight-errors=Swap

2019-03-30_233241.jpg初始化完成之后,根据提示创建kube目录,添加kubectl配置:

这里默认使用root用户,可以根据需要创建普通用户执行。

[root@centos7:/root]
# mkdir -p $HOME/.kube
[root@centos7:/root]
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

由于是root用户不用在去执行第三条命令更改文件属性。

执行完成之后,查看Node节点信息:

2019-03-30_233914.jpg

可以看出master的状态是未就绪(NotReady),之所以是这种状态是因为还缺少一个附件flannel或者Calico或者weave(这些都是k8s网络解决方案),没有网络各Pod是无法通信的。

也可以通过检查组件的健康状态:

[root@centos7:/root]
#  kubectl get componentstatus

2019-03-30_234114.jpg
添加网络组件

1.网络组件之flannel

组件flannel在github上的地址:https://github.com/coreos/flannel

2019-03-30_234654.jpg

根据命令提示进行安装:

[root@centos7:/root]
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

2019-03-30_234906.jpg

仅仅通过执行安装是不够的还需要通过docker images命令查看flannel镜像是否已经拉取下来。

2.网络组件之Weave

网络解决方案weave官方地址:https://www.weave.works/docs/net/latest/kubernetes/kube-addon/

weave相关介绍,仅供参考:https://blog.51cto.com/dengaosky/2069478

执行安装,即可:

# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

安装完weave插件之后,查看节点状态信息,会发现master状态已经处于ready:

2019-03-31_110353.jpg

查看当前节点上属于kube-system名称空间下的pods信息:

[root@centos7:/root]
# kubectl get pods -n kube-system

2019-03-31_110920.jpg

查看节点下的命名空间信息:

[root@centos7:/root]

# kubectl get ns

2019-03-31_111137.jpg

可以查看出有三种命名空间:default(kubectl get pods默认default),kube-public,kube-system(系统级的pod都在kube-system命名空间下)

二.Node节点安装

其余两个Node节点安装

[root@centos7:/root]
# ansible slave -m shell -a "wget -O /root/rpm-package-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg"
[root@centos7:/root]
# ansible slave -m shell -a "wget -O /root/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg"
[root@centos7:/root]
# ansible slave -m shell -a "rpm --import /root/rpm-package-key.gpg"
[root@centos7:/root]
# ansible slave -m shell -a "rpm --import /root/yum-key.gpg "
[root@centos7:/root]
# ansible slave -m shell -a "yum install -y docker-ce kubelet-1.13.3 kubeadm-1.13.3 kubernetes-cni-0.6.0"

启动bridge-nf方式:

[root@centos7:/root]
# ansible slave -m copy -a "src=/etc/sysctl.conf dest=/etc/sysctl.conf"
[root@centos7:/root]
# ansible slave -m shell -a "sysctl -P"

2019-03-31_122203.jpg

将配置文件从master端copy到node节点上:

[root@centos7:/root]
# ansible slave -m copy -a "src=/etc/sysconfig/kubelet dest=/etc/sysconfig/kubelet "
[root@centos7:/root]
# ansible slave -m copy -a 'src=/etc/docker/daemon.json dest=/etc/docker/daemon.json'

2019-03-31_114417.jpg

启动节点上的服务:

[root@centos7:/root]
# ansible slave -m shell -a "systemctl start docker"
[root@centos7:/root]
# ansible slave -m shell -a "systemctl enable docker"
[root@centos7:/root]
# ansible slave -m shell -a "systemctl enable kubelet"

在node节点下载kube-proxy ,paue镜像并修改镜像标签:

[root@centos7:/root]
# ansible slave -m shell -a "docker pull mirrorgooglecontainers/kube-proxy:v1.13.3"
[root@centos7:/root]
# ansible slave -m shell -a "docker pull mirrorgooglecontainers/pause:3.1"
[root@centos7:/root]
# ansible slave -m shell -a "docker tag mirrorgooglecontainers/kube-proxy:v1.13.3 k8s.gcr.io/kube-proxy:v1.13.3"
[root@centos7:/root]
# ansible slave -m shell -a "docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1"

将node节点加入集群:

[root@centos7:/root]
# ansible slave -m shell -a "kubeadm join 192.168.137.100:6443 --token frs7us.e7iukbax80zeid7s --discovery-token-ca-cert-hash sha256:ea10674978cd4bb224c7006f013e1745e87bf18059b02a507eb082baf8ffab25 --ignore-preflight-errors=Swap"

2019-03-31_122954.jpg

在通过kubeadm join加入集群时候,需要等到一会因为在加入集群时各节点正在创建相关pod。

2019-03-31_144850.jpg

在master节点上查看各节点状态信息:

2019-03-31_144403.jpg

可以通过kubectl get pods -n kube-system -o wide查看flannel和proxy有两个,一个在master节点上,一个在node01节点上。

[root@centos7:/root]
# kubectl get pods -n kube-system -o wide

2019-03-31_145005.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章