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

posted @ 2021-06-03 14:09  majingyun  阅读(286)  评论(0编辑  收藏  举报