docker基础学习之五:k8s术语解释及kubectl相关命令

时间:2024-05-21 22:25:03

kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,
Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
k8s和openstack一样,是非常复杂的。
k8s也是编排容器的工具。从创建集群、应用部署、应用提供服务、扩容缩容应用、应用更新都非常的方便。

一、k8s术语解释

1、cluster
cluster是 计算、存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用。
一个基础的kubernetes集群包括一个master节点和多个node节点,
每个节点可以是一台物理机,也可以是一台虚拟机。

在k8s只要使用两条指令就可以创建一个集群
kubectl init 进行初始化,创建一个master节点。
kubectl join xxx 创建一个node节点并加入这个集群。

2、master节点
master节点提供的集群控制,对集群做出全局性决策,例如调度等,通常在Master节点上不运行用户容器。

3、node节点
节点组件运行在每一个node节点上,维护运行的Pod并提供kubernetes运行时的环境。
docker基础学习之五:k8s术语解释及kubectl相关命令

4、pod
Pod是kubernetes管理的最小基础单元。
每个Pod是一个容器或多个容器的一组集合。
形象的理解:容器是硬糖,Pod是硬糖+包装纸
一个Pod中封装了:一个或多个紧耦合的应用容器、存储资源、独立的IP、容器运行的选项。
一个Pod作为一个整体运行在node上。
Pod内的容器共享存储和网络。

5、controller
k8s提供了多种controller,包括deployment、replicaset(简称RS)、RC等

5.1、RC
replication contorller (简称RC)
通常情况下一个应用不会以一个单独的Pod完成,当使用大量的Pod组成一个简单应用时,管理这些Pod的一个方式
就是RC,RC可以指定pod的副本数量,并且当pod有故障时可以自动拉起新的pod, 大大简化了管理难度。现在基本被RS取代了。

5.2、replicaset(简称RS)
是新一代的RC,主要功能和RC一样,维护pod的数量稳定,指定pod的运行位置等。使用方法也相似,
主要区别是更新了API。

一个RS包含多个相同的pod, 实现了pod的多副本管理。使用deployment时会自动创建replicaset,
也就是说deployment是通过replicaset来管理pod的多个副本的,我们通常不需要直接使用replicaset。
而是用更上层的概念deployment调用replicaset。

5.3、deployment
是最常用的controller。deployment可以管理pod的多个副本,
创建deployment时会自动创建RS
deployment可以管理一个或多个RS,并且通过RS来管理pod。

因此从小到大的管理逻辑是
容器 <pod <replicaset <deployment

6、namespace
可以将一个物理的cluster逻辑上划分成多个虚拟cluster,每个cluster就是一个namespace。
它们底层依赖于同一个物理集群。
不同的namespace里的资源是完全隔离的。可以区分不同的项目、用户等。
如开发测试使用的namespace,生产使用的namespace。

7、service
deployment可以部署多个副本,每个pod 都有自己的IP,外界如何访问这些副本呢?
答案是service
k8s的 service定义了外界访问一组特定pod的方式。service有自己的IP和端口,service为pod提供了负载均衡。
k8s运行容器pod与访问容器这两项任务分别由controller和service执行。

8、Label
Label是Kubernetes系统中另一个核心概念。一个Label是一个key=value的键值对,其中key与value由用户自己指定。
Label可以附加到各种资源对象上,如Node、Pod、Service、RC,一个资源对象可以定义任意数量的Label,
同一个Label也可以被添加到任意数量的资源对象上,Label通常在资源对象定义时确定,也可以在对象创建后动态添加或删除。
Label的最常见的用法是使用metadata.labels字段,来为对象添加Label,通过spec.selector来引用对象

9、Volume
Volume是Pod中能够被多个容器访问的共享目录。Kubernetes的Volume定义在Pod上,
它被一个Pod中的多个容器挂载到具体的文件目录下。Volume与Pod的生命周期相同,
但与容器的生命周期不相关,当容器终止或重启时,Volume中的数据也不会丢失。
要使用volume,pod需要指定volume的类型和内容( spec.volumes 字段),
和映射到容器的位置( spec.containers.volumeMounts 字段)。

9、重要组件kubelet、kubeadm 和 kubectl

kubelet 的主要功能就是定时从某个地方获取节点上 pod/container 的期望状态
(运行什么容器、运行的副本数量、网络或者存储如何配置等等),
并调用对应的容器平台接口达到这个状态。
node节点定时与master进行通信,通过kubelet进程来汇报信息。

ubeadm是一个构建k8s集群的工具。它提供的kubeadm init和kubeadm join两个命令是快速构建k8s集群的最佳实践。

二、kubectl相关命令
命令行接口kubectl来管理控制器(deployment、Replicaset)、Pod等
docker基础学习之五:k8s术语解释及kubectl相关命令

2.1查看节点。
[[email protected] ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 125d v1.14.1

查看各种组件状态:
1、查看容器引擎状态,显示active(running)
[[email protected] ~]#systemctl status docker

2、查看kubelet状态,显示active(running)
[[email protected] ~]#systemctl status kubelet

3、查看其它组件及插件状态,显示running。
组件是以程序的形式运行在Linux及容器里面的。
[[email protected] ~]#kubectl get pod --namespace=kube-system

4、查看namespace
[[email protected] ~]#kubectl get namespace
NAME STATUS AGE
default Active 125d
kube-node-lease Active 125d
kube-public Active 125d
buke-system Active 125d

default是默认的namespace,我们创建的所有资源都会放到这里。
buke-system跑的是所有的系统容器,kubernetes集群所必须的这些容器、对象。

创建新的namespace,这种方式比较简单也不常用。
#kubectl create namespace xxx

删除Pod
#kubectl delete pod xxx

2.2 创建deployment
[[email protected] ~]#kubectl create deployment mydep --image=nginx
deployment.apps/mydep created
[[email protected] ~]#kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
mydep 1/1 1 1 11s

2.3 通过kubectl get kube-system查看各管理逻辑(deployment、replicaset、pod )之间的关系,能看出分层管理的逻辑。

[[email protected] ~]#kubectl get deployment -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
coredns 2/2 2 2 128d
kubernetes.dashboard 1/1 1 1 127d
tiller-deploy 1/1 1 1 8d

[[email protected] ~]#kubectl get replicaset -n kube-system
NAME DESIRED CURRENT READY AGE
coredns-fb8bdccf 2 2 2 128d
kubernetes.dashboard-f6b846c 1 1 1 127d
tiller-deploy-59b99695d8 1 1 1 8d

[[email protected] ~]#kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-fb8bdccf-5nq97 1/1 running 11 128d
coredns-fb8bdccf-q94b7 1/1 running 11 128d
etcd-k8s-master 1/1 running 11 128d
kube-apiserver-k8s-master 1/1 running 11 128d
省略部分输出内容

2.4 大部分情况会用yaml文件创建Pod、deployment

2.4.1、用yaml文件创建运行常驻任务的pod
[[email protected] ~]#mkdir /labfile/podfile
#cd /labfile/podfile
#ls
#vim mypod.yaml
kind: Pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
- name: mypod
image: busbox
args:
- /bin/sh
- -c
- sleep 30000

[[email protected] ~]#kubectl apply -f mypod.yaml
pod/mypod created
[[email protected] ~]#kubectl get pod
NAME READY STATUS RESTARTS AGE
mypod 1/1 running 0 3s

进阶命令
查看pod的IP地址
[[email protected] ~]#kubectl get pod -o wide
查看完整的yaml文件信息
[[email protected] ~]#kubectl get pod -o yaml
解释Pod里面的参数,为写yaml文件提供帮助。
[[email protected] ~]#kubectl explain pod

进入pod里的容器,/bin/sh表示Pod的命令行接口
[[email protected] ~]#kubectl exec -it mypod /bin/sh
/ #ls
bin dev etc home proc root sys tmp usr var
/ #exit

[[email protected] ~]#docker ps -a
能看到mypod这个pod是有两个容器的,一个是根容器pause, 一个是以镜像busbox创建的容器。

2.4.2、用yaml文件创建运行一次性任务的pod
#vim helloworld.yaml
kind: Pod
apiVersion: v1
metadata:
name: helloworld
spec:
restartpolicy: Never
containers:
- name: helloworld
image: hello-world

[[email protected] ~]#kubectl apply -f helloworld.yaml
pod/mypod created
[[email protected] ~]#kubectl get pod
NAME READY STATUS RESTARTS AGE
helloworld 0/1 completed 0 8s
mypod 1/1 running 0 18m
看到这个pod(helloworld)是completed。

[[email protected] ~]#kubectl describe pod helloworld
看到这个pod的status是succeeded,表示它运行完一次性任务后正常关闭了。

查看日志的详细输出信息。
[[email protected] ~]#kubectl logs helloworld