子命令使用分类

NameSpace(命名空间)

  • 作用:多租户情况下,实现资源隔离
  • 属于逻辑隔离
  • 属于管理边界
  • 不属于网络边界
  • 可以针对每个namespace做资源配额

查看NameSpace

1
2
3
kubectl get namespace
#或者
kubectl get ns
名字 说明
default 用户创建的pod默认在此命名空间
kube-public 所有用户均可以访问,包括未认证用户
kube-node-lease 集群节点租约状态,v1.13加入
kube-system kubernetes集群系统内部使用的命名空间

创建NameSpace

通过kubectl命令行创建

1
kubectl create namespace test  #创建test命名空间

通过应用资源清单文件创建:

  1. 准备资源清单文件01-create-ns.yaml

    1
    2
    3
    4
    apiVersion: v1
    kind: Namespace
    metadata:
    name: test2
  2. 应用资源清单文件

    1
    kubectl apply -f 01-create-ns.yaml

删除NameSpace

通过kubectl命令行删除

1
kubectl delete namespace test  #删除test命名空间

通过应用资源清单文件删除(使用和创建同样的资源文件):

1
kubectl delete -f 01-create-ns.yaml

Pod

Pod是容器的封装,也是kubernetes集群能够调度的最小单元。

查看Pod

1
2
3
4
5
6
#查看default命名空间中的Pod,pod和pods效果一样
kubectl get pod
kubectl get pods
#查看kube-system命名空间中的Pod
kubectl get pods --namespace kube-system
kubectl get pod -n kube-system

创建Pod

由于网络原因,建议提前准备好容器镜像。本示例使用nginx:latest容器镜像。
编写用于创建Pod资源清单文件02-create-pod.yaml

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: nginx-pod
image: nginx:latest
ports:
-name: nginxport
containerPort: 80

应用用于创建Pod资源清单文件

1
kubectl apply -f 02-create-pod.yaml

访问Pod

1
2
kubectl get pods -o wide   #查看pod更加详细信息
curl http://172.16.1.2 #直接访问pod的地址

删除Pod

1
2
kubectl delete pods pod1               #命令行删除
kubectl delete -f 02-create-pod.yaml #使用Pod资源清单文件删除

Controller(控制器)

Controller(控制器),用于在k8s集群中以loop方式监视Pod状态,如果其发现Pod被删除,将会重新拉起一个Pod,以让Pod一直保持在用户期望状态。
常见Pod控制器:

控制器名称 作用
Deployment 声明式更新控制器,用于发布无状态应用
ReplicaSet 副本集控制器,用于对Pod进行副本规模扩大或剪裁
StatefulSet 有状态副本集,用于发布有状态应用
DaemonSet 在k8s集群每一个Node上运行一个副本,用于发布监控或日志收集类等应用
Job 运行一次性作业任务
CronJob 运行周期性作业任务

Deployment控制器

  • 具有上线部署、滚动升级、创建副本、回滚到以前某一版本(成功/ 稳定)等功能
  • Deployment包含ReplicaSet,除非需要自定义升级功能或者根本不需要升级Pod,否则还是建议使用Deployment而不直接使用ReplicaSet

创建Deployment控制器类型应用

命令行创建:

1
2
3
4
5
6
kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2
# 说明:
# nginx-app 是deployment控制器类型的应用名称
# nginx:latest 是应用运行的Pod中的Container所使用的镜像
# IfNotPresent 是Container容器镜像下载策略,如果本地有镜像,使用本地,如果本地没有镜像,下载镜像
# --replicas=2 是指应用运行的Pod共计2个副本,这是用户的期望值,Deployment控制器中的ReplicaSet控制器会一直监控此应用运行的Pod副本状态,如果数量达不到用户期望,就会重新拉起一个新的Pod,会让Pod数量一直维持在用户期望值数量

查看控制器:

1
2
3
4
5
6
7
8
9
10
11
#查看Deployment控制器类型应用
kubectl get deployment.apps
#查看ReplicaSet控制器类型
kubectl get replicaset
#查看Pod状态
kubectl get pods
#查看Pod状态,显示更宽泛信息
kubectl get pods -o wide
#访问Pod
curl http://172.16.xxx.xx
curl http://172.16.xxx.xx

通过资源清单文件创建,编写用于创建Deployment控制器类型应用资源清单03-creat-deployment-app.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-apps
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginxapp
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80

应用创建Deployment控制器类型应用资源清单

1
2
3
4
5
kubectl apply -f 03-creat-deployment-app.yaml
#查看Deployment控制器类型应用
kubectl get deployment.apps
#查看ReplicaSet控制器类型应用
kubectl get replicaset.apps

删除Deployment控制器类型应用

带有控制器类型的Pod不能随便删除,如果必须删除,请删除控制器类型的应用名称。

1
2
3
4
#通过kubectl命令行删除
kubectl delete deployment.apps nginx-app
#通过kubectl应用资源清单文件删除
kubectl delete -f 03-creat-deployment-app.yaml

Service

Pod的状态不是人为控制的,Pod IP是在创建时分配的,如果在Pod被误删除,被Controller重新拉起一个新的Pod时,Pod IP地址是变化着的,如果访问必Pod则必须更换IP地址。这样对于大量的Pod运行应用来说,无法对Pod进行控制,因此在k8s集群中引入另一个概念Service

Service不是实体服务,是一条iptablesipvs的转发规则。

通过ServicePod客户端提供访问Pod方法,即客户端访问Pod入口,Service通过Pod标签与Pod进行关联。

Service类型

类型 说明
ClusterIP 默认,分配一个集群内部可以访问的虚拟IP
NodePort 在每个Node上分配一个端口作为外部访问入口
LoadBalancer 工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack
ExternalName 表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信

Service参数

参数 说明
port 访问Service使用的端口
targetPort Pod中容器端口
NodePort 通过Node实现外网用户访问k8s集群内Service(30000-32767)

Service创建

通过命令行创建:

1
2
3
4
5
6
7
8
9
10
11
#创建Deployment类型应用
kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=1
#创建Service与Deployment类型应用关联
kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=80
# 说明:
# expose 创建service
# deployment.apps 控制器类型
# nginx-app 应用名称,也是service名称
# --type=ClusterIP 指定service类型
# --target-port=80 指定Pod中容器端口
# --port=80 指定service端口

访问Service以实现访问Pod目的:

1
2
3
4
# 查看Service创建情况
kubectl get service
# 访问Service
curl http://10.109.21.171

通过资源清单YAML文件创建,编写用于创建ClusterIP类型Service资源清单文件create-deployment-service-clusterip.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-apps
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginxapp
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
name: nginx-apps
spec:
type: ClusterIP
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80

应用用于创建Service资源清单文件

1
kubectl apply -f create-deployment-service-clusterip.yaml

基于资源清单YAML文件创建NodePort类型Service,create-deployment-service-nodeport.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-apps
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginxapp
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
name: nginx-apps
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
nodePort: 30001
port: 80
targetPort: 80

验证资源对象创建情况

1
2
3
4
#查看service创建
kubectl get service
#查看k8s集群所有主机30001端口侦听状态
ss -anput | grep ":30001"

在k8s集群外访问Service,在物理机浏览器中访问即可验证。

Service删除

1
2
3
4
#命令行删除
kubectl delete service nginx-app
#通过资源清单YAML文件删除
kubectl delete -f create-deployment-service-clusterip.yaml