一、概念
1、集群简介
一个kubernetes集群主要是由控制节点(master)、**工作节点(node)**构成,每个节点上都会安装不同的组件。
master:集群的控制平面,负责集群的决策 ( 管理 )
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
Etcd:负责存储集群中各种资源对象的信息
node:集群的数据平面,负责为容器提供运行环境 ( 干活 )
Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
KubeProxy : 负责提供集群内部的服务发现和负载均衡
Docker : 负责节点上容器的各种操作
2、kubernetes概念
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
3、Namespace
Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理。
可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。
K8S在启动后,会默认创建一个namespace
[root@master ~]# kubectl get namespace NAME STATUS AGE default Active 45h # 所有未指定Namespace的对象都会被分配在default命名空间 kube-node-lease Active 45h # 集群节点之间的心跳维护,v1.13开始引入 kube-public Active 45h # 此命名空间下的资源可以被所有人访问(包括未认证用户) kube-system Active 45h # 所有由Kubernetes系统创建的资源都处于这个命名空间ku
4、Pod
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
5、Label
Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
Label的特点:
- 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
- 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
- Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除
可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。
一些常用的Label 示例如下:
- 版本标签:“version”:“release”, “version”:“stable”…
- 环境标签:“environment”:“dev”,“environment”:“test”,“environment”:“pro”
- 架构标签:“tier”:“frontend”,“tier”:“backend”
标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:
Label用于给某个资源对象定义标识 Label Selector用于查询和筛选拥有某些标签的资源对象
当前有两种Label Selector:
- 基于等式的Label Selector
name = slave: 选择所有包含Label中key="name"且value="slave"的对象
env != production: 选择所有包括Label中的key="env"且value不等于"production"的对象 - 基于集合的Label Selector
name in (master, slave): 选择所有包含Label中的key="name"且value="master"或"slave"的对象
name not in (frontend): 选择所有包含Label中的key="name"且value不等于"frontend"的对象
标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:
name=slave,env!=production name not in (frontend),env!=production
6、Pod控制器(Deployment)
在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。
7、Service
已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。
虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:
- Pod IP 会随着Pod的重建产生变化
- Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问
这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。
Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
二、快速开始
1、nodes
查看在运行中服务
kubectl get ing -A
查看所有node节点
kubectl get nodes
2、namespace(命名空间)
查看所有namespace(命名空间)
kubectl get namesapce kubectl get ns
查看指定namespace(命名空间)
kubectl get ns nacos
查看参数(指定输出格式json、yaml)
# 命令:kubectl get ns ns名称 -o 格式参数 # kubernetes支持的格式有很多,比较常见的是wide、json、yaml kubectl get ns nacos -o json { "apiVersion": "v1", "kind": "Namespace", "metadata": { "creationTimestamp": "2021-10-17T15:33:29Z", "managedFields": [ { "apiVersion": "v1", "fieldsType": "FieldsV1", "fieldsV1": { "f:status": { "f:phase": {} } }, "manager": "kubectl-create", "operation": "Update", "time": "2021-10-17T15:33:29Z" } ], "name": "nacos", "resourceVersion": "2885349", "uid": "45a93571-dbbd-41de-822f-e67f208fd08b" }, "spec": { "finalizers": [ "kubernetes" ] }, "status": { "phase": "Active" } }
查看ns详情kubectl describe ns ns名称
kubectl describe ns default
创建namespace
kubectl create ns dev-test
删除namespace
kubectl delete ns dev-test
根据配置文件创建、删除
kubectl create -f dev-test.yaml
apiVersion: v1 kind: Namespace metadata: name: dev-test
3、Pod
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:
查看系统pod
kubectl get pod -n kube-system
查看所有pod
kubectl get pod
查看pod(namespace=dev)
kubectl get pods -n dev
查看某个pod
kubectl get pod pod_name
查看pod详细信息
kubectl describe pod nginx-5ff7956ff6-fg2db -n dev
查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml
查看pod所在IP(集群内IP)
kubectl get pods -n dev -o wide # 用来curl curl http://10.244.1.23:80
删除
删除指定pod(过会会自动重启)
kubectl delete pod nginx-64777cd554-zgfqj -n dev
通过控制器删除pod
kubectl get deploy -n dev # 删除pod控制器 kubectl delete deploy nginx -n dev # 稍等片刻,再查询Pod,发现Pod被删除了 kubectl get pod -n dev
通过配置文件启动pod
#创建pod kubectl create -f dev-pod.yaml # 删除pod kubectl delete -f dev-pod.yaml
apiVersion: v1 kind: Pod metadata: name: nginx namespace: dev spec: contakubiners: - image: nginx:1.17.1 name: pod ports: - name: nginx-port containerPort: 80 protocol: TCP
4、Label
给pod打标签(version=1.0)
kubectl label pod nginx version=1.0 -n dev
更新pod标签(version=2.0)
kubectl label pod nginx version=2.0 -n dev --overwrite
筛选指定label
标签(-l
)
kubectl get pod -n dev -l version=2.0 --show-labels
删除label
kubectl label pod nginx version- -n dev
通过配置更新label
kubectl apply -f pod-nginx.yaml
apiVersion: v1 kind: Pod metadata: name: nginx namespace: dev labels: version: "3.0" env: "test" spec: containers: - image: nginx:1.17.1 name: pod ports: - name: nginx-port containerPort: 80 protocol: TCP
5、控制器(deployment)
创建pod(3个)
# 命令格式: kubectl run deployment名称 [参数] # --image 指定pod的镜像 # --port 指定端口 # --replicas 指定创建pod数量 # --namespace 指定namespace kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=3 -n dev
查看创建的Pod
kubectl get pods -n dev
查看deployment的信息
# 查看deployment的信息 kubectl get nginx -n dev
查看deployment的信息(以wide方式)
# UP-TO-DATE:成功升级的副本数量 # AVAILABLE:可用副本的数量 kubectl get nginx -n dev -o wide
查看deployment的详细信息
kubectl describe nginx -n dev
删除
kubectl delete deploy nginx -n dev
以配置文件创建
# 创建 kubectl create -f deploy-nginx.yaml # 删除 kubectl delete -f deploy-nginx.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: dev spec: replicas: 3 selector: matchLabels: run: nginx template: metadata: labels: run: nginx spec: containers: - image: nginx:1.17.1 name: nginx ports: - containerPort: 80 protocol: TCP
6、Service
操作一:创建集群内部可访问的Service
创建Service
kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
查看(svc)
kubectl get svc svc-nginx1 -n dev -o wide
内网访问Service
# 这里产生了一个CLUSTER-IP,这就是service的IP,在Service的生命周期中,这个地址是不会变动的 # 可以通过这个IP访问当前service对应的POD curl 10.109.179.231:80
操作二:创建集群外部也可访问的Service
# 上面创建的Service的type类型为ClusterIP,这个ip地址只用集群内部可访问 # 如果需要创建外部也可以访问的Service,需要修改type为NodePortkubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
此时查看,会发现出现了NodePort类型的Service,而且有一对Port(80:31928/TC)
kubectl get svc svc-nginx-2 -n dev -o wide
访问:http://39.105.214.55:31246/
删除Service
kubectl delete svc svc-nginx-1 -n dev
通过配置文件
# 创建 kubectl create -f svc-nginx.yaml # 删除 kubectl delete -f svc-nginx.yaml
apiVersion: v1 kind: Service metadata: name: svc-nginx namespace: dev spec: clusterIP: 10.109.179.231 ports: - port: 80 protocol: TCP targetPort: 80 selector: run: nginx type: ClusterIP