Kubernetes入门和实践
Kubernetes入门和实践
一、kubernetes概述
1、kubernetes又称k8s,是google在2014年发布的开源框架;
2、Google 最初开发了一个borg系统(现在命名omega),来调度20多亿容器,在积累了数十年的经验后,Google重写容器管理系统并开源。
3、市场占有率最高的容器编排引擎产品。
4、kubernetes中文社区https://www.kubernetes.org.cn/k8s
二、安装minikube
1、设置阿里云镜像
vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
2、安装minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube
3、安装kubectl
curl -LO https://dl.k8s.io/release/v1.20.0/bin/linux/amd64/kubectl sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
3、安装conntrack
yum install conntrack
三、安装kubernetes后的操作
1、启动minikube
minikube start --vm-driver=none --image-mirror-country='cn
2、停止minikube
minikube stop
3、kubernetes指令比较宽松
执行 kubectl get node 和 kubectl get nodes得到一样的结果。
4、常用指令
1)获得节点
Kubectl get node
2)创建deployment
kubectl create deployment my-nginx --image nginx:latest
指定镜像
3)查看所有的deployment
Kubectl get deploy
Kubectl get deployment
4) 查看所有pod
Kubectl get pod
Kubectl get pods
5) 查看所有port信息ip和port
get pods –o wide
6) 查看所有service
7)查看所有的命名空间
Kubectl get namespace
8)将my-ngnix 的deployment ,修改其副本数为3个
Kubectl scale deployments/my-ngnix –replicas=3
也可以通过配置文件修改。
Vim ngnix.yml 修改副本数为4
再执行:kubectl apply –f home/muse/ngnix.yml 配置文件生效
四、k8s重要概念
1、cluster
计算存储网络资源的集合
K8s利用这些资源运行基于各种容器的应用
2、master
是大脑,决定应用在哪里运行。职责是调度。
3、node
职责是运行容器应用。职责:运行;负责监控和汇报容器的状态。
4、pod
K8s最小的工作单元,包含1个或多个容器
Pod的作用:
1)按组管理
如果有一些容器可以紧密结合在一起的话,我可以将它们按组部署到1个pod单元里面。
2)通讯和资源的共享。
在一个pod里面,有相同的ip和端口,那么它们之间可以通过localhost通讯,如果挂载,那么将挂载这个pod里面的每一个容器。
使用方式:
1>1个pod运行一个容器,这是最常用的。
2>1个pod运行多个容器
5、controller(管理pod的能力)
K8s通过它来管理pod
1) deployment(最常用的controller)
它可以管理pod的多个副本
2)Replicaset
它也是实现对pod的多个副本管理。
我们使用deployment的时候,它会自动创建Replicaset。
也就是,deployment其实是借用Replicaset进行pod多副版本管理的。
3)daemonSet
它实现对pod一个副版本的管理
4)statefullset
能确保pod的每个副本在整个生命周期中名称是不变的。
Pod有频繁创建和死亡,有这个可以保证名称不变。
5)job
用于运行结束就删除的应用
6、service(访问pod的能力)
Service有自己的ip和端口,它定义了一组外界访问pod的方式,提供了对pod的负载均衡。
7、namespace
解决同一个cluster中,如何区分开controller、pod等资源的问题;
它将一个物理的cluster划分为多个虚拟的cluster,每个namespace的资源是完全隔离的。
五、k8s架构
1、k8s架构图
1)Master大脑。它决定pode在哪个上面运行。
Kubernetes的系统组件都被放到kube-system的namespace中。
Kubelet是唯一没有以容器形式运行的kubernetes组件。
Configmap配置的东西都放到etcd里面。Etcd也会存储节点的当前状态。
Kubectl请求时,第一步就请求到了apiserver。
Api-sever 客户端工具组件,相当于k8s的前端接口。
Scheduler:负责将pode放到对应的node运行,起到调度的作用,它知道整个负载的拓扑图,起到负载均衡的作用。
Controller manager
管理cluster的资源。管理pod.
Etcd:
它负责存k8s的配置信息,以及各种资源的状态信息。
当数据发生变化时可以快速通知相关组件。
Pod网络:
保证pod之间的通信。
2)node
它是pod运行的地方。
Kube-proxy:
提供外界对pod的访问;负责对访问的流转;如果有多个副本,他会实现对pod的负载均衡。
Kubelet:
它的作用是根据具体信息进行pod的创建和运行操作。
3)pod的创建过程
Deployment 创建ReplicaSet; ReplicaSet创建node;name是一层层的。
2、执行流程
当我们执行部署应用并指定两个副本的时候的执行流程:
1)kubectl发送部署请求到api server。
2)api server 通知controller manager创建一个deployment资源。
3)scheduler执行调度任务,将两个副本pode 分发到两个node上。
两个副本需要创建两个node。
4)node1和node2上的kubelet在各自的节点上创建并运行pode。
K8s框架中主要有master和node组成。
六、deployment
1、创建资源的方式
方式一:
用kubectl直接创建。
比如:
kubectl run nginx-deployment--image=nginx:1.7.9--replicas=2
在命令行通过参数指定资源的属性。(但是,在k8s 1.18.0以后 –replicas已弃用,推荐使用 apply创建node)
方式二:
通过配置文件和kubectl apply创建
步骤:
1>编写yml配置文件。
2>执行命令kubectl apply –f /home/muse/ngnix.yml
七、FailOver
设置pod数为3个,当其中一个node1异常时,会在另外一个node2生成新的pod,维护pod数量为3,
当node1异常恢复时,新创建的pod也会在node2上,并不会做迁移动作。
Replicas:2
部署副本实例数量,默认是1
Metadata:
Metadata定义pod的元数据,至少要定义一个lable,lable的key和value可以任意指定。
Spec:描述pod的规格,此部分定义pod中每一个容器的属性。Name和image是必须的。
Kubectl describe deployment 名称
看deployment进行的详细描述。
八、label
1、默认设置下,所有的scheduler会将pod调度到所有可用的node,不过有些情况我们可用通过label将pod调度到指定的node。比如,将有大量磁盘I/O的pod部署到配置了ssd的node。
2、给K8s node1加标签,disktype = ssd;
Kubectl label nod k8s-node 1 disktype = ssd
3、修改nginx.yml配置文件,指定nodeSelector为上一步新建的label:
nodeSelector:
disktype:ssd
4、重新部署deployment
Kubectl apply –f nginx.yml
5、查看节点的标签信息
Kubectl get node –show- labels
九、删除deployment
1、假如现在配置的是两个pod数,如果删除其中的1个pod,依然会被deployment根据配置补充为两个。
2、当我们删除deployment的时候pod也会随之删除。
3、删除pod命令
kubectl delete pod nginx-deployment-7f4fc68488-5v4m7
4、删除deployment
kubectl delete deployment nginx-deployment
十、DaemonSet
1、deployment部署的副本pod,会分布在各个node上,每个node都可以运行好几个副本,DaemonSet的不同之处是,每个node只运行1个副本。
2、DaemonSet的典型应用场景
1)在每个节点上运行存储Daemo,比如:glusterd或ceph
2)在每个节点上运行日志收集Daemo,比如flunentd或logstash。
3)在每个节点上运行监控Daemo
3、查看k8s自己就用DaemonSet运行系统组件
Kube-proxy 应用DaemonSet
十一、job
1、容器按着持续时间分为服务类容器和工作类容器。
2、服务类容器需要持续提供服务,一直运行;比如http server、Daemom等;工作类容器则是一次性任务,比如批处理任务,完成后就退出。
3、job 运行
Kubectl apply –f myjob.yml
Job.yml
看启动日志
Kubectl logs myjob-dlvkg
配置文件增加completions 6,要求总数是6
Parralelism 2 并行数
也可以定时执行 schedule:* * /1 * * * * 每分钟执行一次
Kubectl get sronjob
4、重启kubernetes
Systemctl restart kubelet.service
十二、service
1、我们不应该期望pod是健壮的,而是会因为各种原因而发生故障。
2、deployment等controller通过创建和销毁pod,来保证整个应用的健壮性,换句话说,pod是脆弱的,但是整个应用是健壮的。
3、Service 提供了固定的ip和端口,并且里面包含一组pod,即使pod的ip发生变化,但是面对客户端的是service的固定ip和端口。
十三、Rolling update
滚动更新是一次只更新一小部分副本,成功后再更新更多的副本,最终完成真个副本的更新。滚动更新的最大好处就是零停机,更新过程始终有副本在运行,从而保证整个系统的连续性。
看版本上线的历史:
Kubectl rollout history deployment httpd
回滚:kubectl rollout undo deployment httpd –to – revision =3