kubernetes

应用程序编排工具

一、ansible是新出现的自动化运维工具,也叫应用程序编排工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
二、应用程序docker化后出现了新的编排工具。
A.早期Docker编排三剑客:docker compose ,docker swarm,docker machine
1、docker compose适用在单机环境里部署一个或多个容器,并自动把多个容器互相关联起来。
2、docker swarm 将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。
3、docker machine:负责在多种平台上快速安装 Docker 环境。
B.mesos marathon
C.kubernetes(最流行)

DevOps

DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠
它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运维工作必须紧密合作。

CI

持续集成
持续集成实现从开发->提交代码->部署测试环境->测试(单元测试、接口测试、手动测试)->可交付的快速过程

CD

持续交付(Delivery)
持续部署(Deployment)

kubernetes简介

Kubernetes是Google开源的一款容器编排工具,它是诞生在Google内部运行N多年的博格系统之上的产物,因此其成熟度从其诞生初期就广泛受到业界的关注,并且迅速成为编排工具市场的主流,其社区活跃度非常高,版本迭代速度也很惊人,它的主要作用是对Docker容器做编排工作,当然,Docker只是容器工具的一种引擎,K8s可支持多种容器引擎,但从目前来说Docker容器引擎是具有绝对优势的,
容器需要编排,也很容易理解,因为我们最核心要跑到业务通常都是LNMT/P的不同形式的扩展,但NMT/P他们的运行是有先后顺序的,也就是说MySQL要先启动,然后是Tomcat或PHP,最后是Nginx,而控制这种顺序就需要有容器编排工具来帮我们实现,
另外,我们的业务希望7x24小时在线,如何保障?靠人是很难做到实时的,但编排工具可以,K8s帮我们实现了很多控制器,这控制器可以帮我们监控容器运行的状态,并自动帮我们重建(在容器时代重启就是重建)容器,并且还可以在容器处理能力不足时,自动根据我们定义的扩展规则,自动创建新Pod(k8s中最小单元,每个Pod中可有一个或多个容器),并且在压力下去后,自动删除Pod等等功能。

K8s的中文官方文档zh站点

https://www.kubernetes.org.cn/k8s

kubernetes中文社区

https://www.kubernetes.org.cn

kubernetes源码位置

https://github.com/kubernetes

MAC安装kubernetes

一、Mac中安装了Docker之后,会自动安装了Kubernetes,正常情况下,我们只需要在Docker的Preferrences->Kubernetes中勾选Enable Kubernetes,然后点击Apply按钮即可。但由于伟大的墙的存在,如果您是直接在Docker中启用Kubernetes,Kubernetes的状态会一直都是kubernetes is starting…,原因是有一些Kubernetes依赖的镜像不能正常的下载。
1、手动拉取镜像:git clone https://github.com/maguowei/k8s-docker-for-mac,
2、修改k8s-docker-for-mac目录中的images文件,将Kubernetes版本修改为当前docker支持的版本。
3、执行sh load_images.sh拉去镜像
4、镜像拉取完成后,勾选Enable Kubernetes,点击Apply按钮,等待几分钟,出现下图的状态表示启用成功。
在这里插入图片描述

Kubernetes dashboard

参考:http://www.fwhyy.com/2019/05/building-kubernetes-in-mac/
一、Kubernetes dashboard是一个Web界面的管理工具
二、执行下面命令后,会监听本机的8001的端口,
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
kubectl proxy #默认情况下代理的是8001端口,如果要指定端口用下面命令
kubectl proxy --port=8080

这时访问http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login,可以进入登录界面

K8S特点

自动装箱(自动完成部署)
  自我修复
  水平扩展
  服务发现和负载均衡
  自动发布和回滚
  秘钥和配置管理集中化(配置中心)
  存储编排
  批量处理执行

集群

一、集群是将许多台主机当成一台主机来使用
二、k8s集群是有中心节点架构的模型

k8s架构图

在这里插入图片描述
在这里插入图片描述
   在这里插入图片描述

kubectl

kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
具体参考https://blog.csdn.net/qq_17200461/article/details/106598832

Pod

k8s最小的调度的逻辑单元
容器的外壳,pod内运行容器,共享nat、uts和ipc,共享存储卷
一般来说一个pod内只放一个容器
在一个资源池内进行统一管理(dockfile中打标签来进行区分) 
Pod分类:
    自主式pod:
    控制器管理的pod在这里插入图片描述

Pods控制器

replicationController:副本控制器,确保预期的Pod副本数量,管理pod状态,滚动更新
k8s中常见的的pods管理器包括:
Deployment:无状态应用部署
DaemonSet:确保所有Node运行同一个Pod
statefuSet:有状态应用部署
replicaSet
Job,一次性任务
cronjob定时任务
在这里插入图片描述

Name

在这里插入图片描述

Namespaces

命名空间,将对象逻辑上隔离
在这里插入图片描述

Label

标签,附加到某个资源上,用于关联对象、查询和筛选
在这里插入图片描述

Label选择器

在这里插入图片描述

Service

防止Pod失联
定义一组Pod的访问策略
在这里插入图片描述

Ingress

在这里插入图片描述

Annotations

注释

核心组件

在这里插入图片描述

etcd

key-value键值存储数据库,用来存储kubernetes的信息的
  多个master之间需要共享存储,通过k8s的Etcd数据库存储。
  Etcd 是key-value型的数据库  
  在这里插入图片描述

Master/Node

1、可设置多台机器为master节点,多余节点作为备用机
2、master节点主要包含组件API Server, Scheduler,Controller-Management,etcd
3、node节点主要包含组件:kubelet,docker,kube-proxy

kube-apiserver

用户和 kubernetes 集群交互的入口,封装了核心对象的增删改查操作,提供了 RESTFul 风格的 API 接口,通过 etcd 来实现持久化并维护对象的一致性。
在这里插入图片描述

kube-controller-manager

处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。
主要是用于保证 replicationController 定义的复制数量和实际运行的 pod 数量一致,另外还保证了从 service 到 pod 的映射关系总是最新的。
在这里插入图片描述

kube-scheduler

调度器(scheduler):负责观测node的节点资源使用情况(预选,优选)
根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
负责集群资源的调度和管理,例如当有 pod 异常退出需要重新分配机器时,scheduler 通过一定的调度算法从而找到最合适的节点。
在这里插入图片描述

kubelet

运行在 node节点,负责和节点上的 Docker 交互,例如启停容器,监控运行状态等。  
集群代理(启动并管理pod)
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
在这里插入图片描述

kube-proxy

运行在 node 节点,负责为 pod 提供代理功能,会定期从 etcd 获取 service 信息,并根据 service 信息通过修改 iptables 来实现流量转发(最初的版本是直接通过程序提供转发功能,效率较低。),将流量转发到要访问的 pod 所在的节点上去。 
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
在这里插入图片描述

docker或rocket

容器引擎,运行容器。

HPA(HorizonTalPodAutoscaler)

自动控制器,根据负载需求调整pod个数
    Pod生命周期需要用到服务发现机制
      Service管理pod(调度),根据label标签来关联pod对象
      Client - >service -> pod*N
      DNS对service进行解析
    AddOns:附件(附加组件)  
    客户端和pod之间的桥梁:service(固定不变)
    Label(标签):固定不变,连接service-----名称解析(DNS)

NMT集群

Nginx对外、Tomcat、M:db
在这里插入图片描述
三个核心组件:service、控制器、标签选择器
service有两种类型,一种供内部使用,一种供外部使用。
POD中的容器由控制器创建

LBaas 负载均衡

K8s网络(三个网段的网络)

一、Pod网络
每个pod 都有一个IP (IP peer POD),所有的pod运行在同一网段中,
二、Service(集群)网络(虚拟网络只存在与iptables或ipvs之中)
service和pod是不同网段的地址
service地址是虚拟的,它通过规则配置实现通信
三、节点网络
四、

  1. 一个pod内容器间通信: pod内的所有容器共享一个LINUX NET NAMESPACE (网络堆栈), pod内的容器, 都可以使用localhost 来访问pod 内的其他容器。
  2. Pod间通信:
     所有pod 通过ip直接访问其他pod而不管pod 是否在同一台物理机上。
     pod ip不可重复
     在这里插入图片描述
  3. Pod与Service通信: 即PodIP去访问ClusterIP,当然,clusterIP实际上是IPVS 或 iptables规则的虚拟IP,是没有TCP/IP协议栈支持的。但不影响Pod访问它.
  4. Service与集群外部Client的通信,即K8s中Pod提供的服务必须能被互联网上的用户所访问到。
     Overlay Network,叠加网络
        同一个pod内的多个容器间:lo
        各个pod之间的通信(snat-dnat,两级pod转换),通过主机访问pod
        Pod与service之间的通信(宿主机规则)

k8s-集群搭建的三种方式

目前主流的搭建k8s集群的方式有kubeadm、minikube,二进制包。
一、kubeadm
是一个工具,用于快速搭建kubernetes集群,目前应该是比较方便和推荐的,简单易用
kubeadm是Kubernetes 1.4开始新增的特性
kubeadm init 以及 kubeadm join 这两个命令可以快速创建 kubernetes 集群
二、minikube
一般用于本地开发、测试和学习,不能用于生产环境
是一个工具,minikube快速搭建一个运行在本地的单节点的Kubernetes
三、二进制包
在官网下载相关的组件的二进制包,上面的两个是工具,可以快速搭建集群,也就是相当于用程序脚本帮我们装好了集群,前两者属于自动部署,简化部署操作,自动部署屏蔽了很多细节,使得对各个模块感知很少,遇到问题很难排查,如果手动安装,对kubernetes理解也会更全面。

centos 7.4 +上使用kubeadm 快速部署K8S集群

参考:https://www.cnblogs.com/double-dong/p/11483670.html
一、环境要求
硬件需求:CPU>=2c ,内存>=2G
二、环境角色

IP角色安装软件
192.168.73.138k8s-Masterkube-apiserver kube-schduler kube-controller-manager docker flannel kubelet
192.168.73.139k8s-node01kubelet kube-proxy docker flannel
192.168.73.140k8s-node01kubelet kube-proxy docker flannel

三、环境初始化,在三台机器上都执行
1、关闭防火墙及selinux
$ systemctl stop firewalld && systemctl disable firewalld​
$ sed -i ‘s/^SELINUX=.*/SELINUX=disabled/’ /etc/selinux/config && setenforce 0

2、关闭 swap 分区
$ swapoff -a # 临时

3、分别在192.168.73.138、192.168.73.139、192.168.73.140上设置主机名及配置hosts
$ hostnamectl set-hostname k8s-master(192.168.73.138主机打命令)
$ hostnamectl set-hostname k8s-node01(192.168.73.139主机打命令)
$ hostnamectl set-hostname k8s-node02 (192.168.73.140主机打命令)

4、在所有主机上上添加如下命令
$ cat >> /etc/hosts << EOF192.168.4.34 k8s-master192.168.4.35 k8s-node01192.168.4.36 k8s-node02EOF
5、内核调整,将桥接的IPv4流量传递到iptables的链
$ cat > /etc/sysctl.d/k8s.conf << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF$ sysctl --system
6、设置系统时区并同步时间服务器
#yum install -y ntpdate
#ntpdate time.windows.com

7、安装 docker
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce-18.06.1.ce-3.el7
$ systemctl enable docker && systemctl start docker
$ docker --version
Docker version 18.06.1-ce, build e68fc7a

8、添加kubernetes YUM软件源
$ cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
EOF

9、2.2.6 安装kubeadm,kubelet和kubectl
$ yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
$ systemctl enable kubelet

四、部署Kubernetes Master
只需要在Master 节点执行,这里的apiserve需要修改成自己的master地址

[root@k8s-master ~]# kubeadm init
–apiserver-advertise-address=192.168.73.138
–image-repository registry.aliyuncs.com/google_containers
–kubernetes-version v1.15.0
–service-cidr=10.1.0.0/16
–pod-network-cidr=10.244.0.0/16

根据输出提示操作:
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config
默认token的有效期为24小时,当过期之后,该token就不可用了,

获取ca证书sha256编码hash值
[root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed ‘s/^.* //’
ce07a7f5b259961884c55e3ff8784b1eda6f8b5931e6fa2ab0b30b6a4234c09a

节点加入集群
[root@k8s-node01 ~]# kubeadm join --token aa78f6.8b4cafc8ed26c34f --discovery-token-ca-cert-hash sha256:0fd95a9bc67a7bf0ef42da968a0d55d92e52898ec37c971bd77ee501d845b538 192.168.73.138:6443 --skip-preflight-chec

五、加入Kubernetes Node
在两个 Node 节点执行
使用kubeadm join 注册Node节点到Matser
kubeadm join 的内容,在上面kubeadm init 已经生成好了

[root@k8s-node01 ~]# kubeadm join 192.168.4.34:6443 --token 2nm5l9.jtp4zwnvce4yt4oj
–discovery-token-ca-cert-hash sha256:12f628a21e8d4a7262f57d4f21bc85f8802bb717dd6f513bf9d33f254fea3e89
六、 安装网络插件
1、只需要在Master 节点执行
[root@k8s-master ~]# wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
2、修改镜像地址:(有可能默认不能拉取,确保能够访问到quay.io这个registery,否则修改如下内容)
[root@k8s-master ~]# vim kube-flannel.yml
进入编辑,把106行,120行的内容,替换如下image,替换之后查看如下为正确 在这里插入图片描述
[root@k8s-master ~]# cat -n kube-flannel.yml|grep lizhenliang/flannel:v0.11.0-amd64
106 image: lizhenliang/flannel:v0.11.0-amd64
120 image: lizhenliang/flannel:v0.11.0-amd64
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
[root@k8s-master ~]# ps -ef|grep flannel
root 2032 2013 0 21:00 ? 00:00:00 /opt/bin/flanneld --ip-masq --kube-subnet-mgr

查看集群的node状态,安装完网络工具之后,只有显示如下状态,所有节点全部都Ready好了之后才能继续后面的操作
复制代码
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 37m v1.15.0
k8s-node01 Ready 5m22s v1.15.0
k8s-node02 Ready 5m18s v1.15.0
[root@k8s-master ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-bccdc95cf-h2ngj 1/1 Running 0 14m
coredns-bccdc95cf-m78lt 1/1 Running 0 14m
etcd-k8s-master 1/1 Running 0 13m
kube-apiserver-k8s-master 1/1 Running 0 13m
kube-controller-manager-k8s-master 1/1 Running 0 13m
kube-flannel-ds-amd64-j774f 1/1 Running 0 9m48s
kube-flannel-ds-amd64-t8785 1/1 Running 0 9m48s
kube-flannel-ds-amd64-wgbtz 1/1 Running 0 9m48s
kube-proxy-ddzdx 1/1 Running 0 14m
kube-proxy-nwhzt 1/1 Running 0 14m
kube-proxy-p64rw 1/1 Running 0 13m
kube-scheduler-k8s-master 1/1 Running 0 13m
复制代码
只有全部都为1/1则可以成功执行后续步骤,如果flannel需检查网络情况,重新进行如下操作
kubectl delete -f kube-flannel.yml
然后重新wget,然后修改镜像地址,然后
kubectl apply -f kube-flannel.yml

七、测试Kubernetes集群
在Kubernetes集群中创建一个pod,然后暴露端口,验证是否正常访问:

[root@k8s-master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

[root@k8s-master ~]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-554b9c67f9-wf5lm 1/1 Running 0 24s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.1.0.1 443/TCP 39m
service/nginx NodePort 10.1.224.251 80:31745/TCP 9

访问地址:http://NodeIP:Port ,此例就是:http://192.168.73.138:32039
在这里插入图片描述
八、部署 Dashboard

使用二进制方式安装K8S

在这里插入图片描述

管理k8s核心资源的三种方法

在这里插入图片描述

陈述式资源管理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

声明式资源管理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

插件

在这里插入图片描述

flannel

Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,需要另外下载部署。我们知道当我们启动 Docker 后会有一个用于和容器进行交互的 IP 地址,如果不去管理的话可能这个 IP 地址在各个机器上是一样的,并且仅限于在本机上进行通信,无法访问到其他机器上的 Docker 容器。Flannel 的目的就是为集群中的所有节点重新规划 IP 地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的 IP 地址,并让属于不同节点上的容器能够直接通过内网 IP 通信。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值