第一章 Namespace
1.1 概述
- namespace是Kubernetes系统中一种非常重要的资源,它的主要作用是用来实现多套系统的资源隔离或者多租户的资源隔离。
- 默认情况下,Kubernetes集群中的所有Pod都是可以相互访问的。但在实际中,可能不想让两个Pod之间进行互相的访问,那么此时就可以将两个Pod划分到不同的namespace下。Kubernetes通过将集群内部的资源分配到不同的namespace中,可以形成逻辑上的组,以方便不同的组的资源进行隔离使用和管理。
- 可以通过Kubernetes的授权机制,将不同的namespace交给不同的租户进行管理,这样就实现了多租户的资源隔离。此时还能结合Kubernetes的资源配额机制,限定不同租户能占用的资源。例如:CPU使用量、内存使用量等,来实现租户可用资源的管理。

# Kubernetes在集群启动后,会默认创建几个namespace$ kubectl get namespace# default:所有未指定namespace的对象都会被分配在default命名空间# kube-node-lease:集群节点之间的心跳维护# kube-public:此命名空间的资源可以被所有人访问(包括未认证用户)# kube-system:所有由Kubernetes系统创建的资源都处于这个命名空间
1.2 应用示例
# 查看所有命名空间
$ kubectl get namespace[ns]
# 查看指定命名空间
$ kubectl get ns default
# 指定命名空间的输出格式
# 显示更多信息如IP
$ kubectl get ns default -o wide
# 以yaml格式显示
$ kubectl get ns default -o yaml
# 以json格式显示
$ kubectl get ns default -o json
# 删除命名空间
$ kubectl delete ns dev
# 查看命名空间详情
$ kubectl describe ns default

$ cat ns-dev.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
# 通过命令式对象配置创建ns
$ kubectl create -f ns-dev.yaml
# 通过命令式对象配置删除ns
$ kubectl delete -f ns-dev.yaml
第二章 Pod
2.1 概述
- Pod是Kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
- Pod可以认为是容器的封装,一个Pod中可以存在一个或多个容器。

Kubernetes在集群启动之后,集群中的各个组件也是以Pod方式运行的,可以用一下命令查看:
**$ kubectl get pods -n kube-system**
2.2 语法与示例
```shell
语法:
创建并运行Pod
$ kubectl run (pod名称) [参数] —image 指定Pod的镜像 —port 指定端口 —namespace 指定命名空间
示例:
在名称为dev的namespace下创建一个nginx的pod
$ kubectl create ns dev $ kubectl run nginx —image=nginx:1.17.1 —port=80 —namespace=dev

```shell
# 语法:
# 查询所有Pod的基本信息
# 若不加-n参数,指定命名空间,默认查询default空间
$ kubectl get pods -n namespace
# 示例:
# 查询名称为dev的namespace下的所有Pod的基本信息
$ kubectl get pods -n dev

# 语法:
# 查看Pod的详细信息
$ kubectl describe pod pod-name -n namespace
# 示例:
# 查看名称为dev的namespace下的Pod的名称为nginx的详细信息
$ kubectl describe pod nginx -n dev

# 语法:
# 获取Pod的IP
$ kubectl get pods -n dev -o wide
# 示例:
# 通过curl访问
$ curl ip:port

# 语法:
# 删除指定的Pod
$ kubectl delete pod pod-name [-n namespace]
# 示例:
# 删除Pod,nginx
$ kubectl delete pod nginx -n dev

# pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
# 创建pod
$ kubectl create -f pod-nginx.yaml
# 删除pod
$ kubectl delete -f pod-nginx.yaml
第三章 Label
3.1 概述
Label是kubernetes的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
Label的特点:
- 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等
- 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去
- Label通常在资源对象定义时确定,当然也可以在对象创建后动态的添加或删除
可以通过Label实现资源的多纬度分组,以便灵活、方便地进行资源分配、调度、配置和部署等管理工作。
标签定义完毕之后,还要考虑到标签的选择,这就要用到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”或value=“slave”的对象
name not in (master,slave):选择所有包含Label中的key=“name”并且value!=“master”和value!=“slave”的对象
- 标签的选择条件可使用多个,此时将多个Label Selector进行组合,用逗号分隔,例如:
name=salve,env!=production
name not in (master,slave),env!=production
3.2 语法与示例
# 语法:
# 给资源打标签
$ kubectl label pod pod-name key=value [-n namespace]
# 示例:
# 给名为nginx的Pod打标签
$ kubectl label pod nginx version=1.0 -n dev
# 查看标签
$ kubectl get pod nginx -o wide -n dev


# 语法:
# 更新资源的标签
$ kubectl label pod pod-name key=value [-n namespace] --overwrite
# 示例:
# 名为nginx的Pod更新标签
$ kubectl label pod nginx version=2.0 -n dev --overwrite

# 语法:
# 查看标签
kubectl get pod pod-name [-n namespace] --show-labels
# 示例:
# 显示名为Nginx的Pod的标签
kubectl get pod nginx -n dev --show-labels

# 语法:
# 筛选标签
$ kubectl get pod -l key=value [-n namespace] --show-labels
# 示例:
# 筛选version为2.0并且在dev命名空间下的Pod
$ kubectl get pod -l version=2.0 -n dev --show-labels

# 语法:
# 删除标签
$ kubectl label pod pod-name key- [-n namespace]
# 示例:
# 删除名称为dev的namespace下的Nginx的Pod上的标签
$ kubectl label pod nginx version- -n dev

# 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
imagePullPolicy: IfNotPresent
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
# 创建
$ kubectl create -f pod-nginx.yaml
# 删除
$ kubectl delete -f pod-nginx.yaml
第四章 Deployment
4.1 概述
在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于Pod的管理,确保Pod资源符合预期的状态,当Pod的资源出现故障的时候,会尝试进行重启或重建Pod。
在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。
4.2 语法与示例
特别注意:在v1.18版之后,kubectl run nginx —image=nginx —replicas=2 —port=80,会反馈Flag —replicas has been deprecated, has no effect and will be removed in the future,并且只会创建一个Nginx容器实例。
# 语法:
# 创建指定名称的deployement
$ kubectl create deployment[deploy] pod-name [-n namespace]
# 示例:
# 在名称为test的命名空间下创建名为nginx的deployment
$ kubectl create deployment nginx --image=nginx:1.17.1 -n test

# 语法:
# 根据指定的deplyment创建Pod
$ kubectl scale deployment pod-name [--replicas=正整数] [-n namespace]
# 示例:
# 在名称为dev的命名空间下根据名为nginx的deployment创建4个Pod
$ kubectl scale deployment nginx --replicas=4 -n dev

# 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
# 创建
$ kubectl create -f deploy-nginx.yaml
# 删除
$ kubectl delete -f deploy-nginx.yaml
# 语法:
# 查看创建的Pod
$ kubectl get pods [-n namespace]
# 示例:
# 查看名称为dev的namespace下通过deployment创建的3个Pod
$ kubectl get pods -n dev

# 语法:
# 查看deployment的信息
$ kubectl get deployment[deploy] [-n namespace]
# 示例:
# 查看名称为dev的namespace下的deployment
$ kubectl get deployment -n dev

# 语法:
# 查看deployment的详细信息
$ kubectl describe deployment[deploy] pod-name [-n namespace]
# 示例:
# 查看名为dev的namespace下的名为nginx的deployment的详细信息
$ kubectl describe deployment nginx -n dev

# 语法:
# 删除deployment
$ kubectl delete deployment[deploy] pod-name [-n namespace]
# 示例:
# 删除名为dev的namespace下的名为nginx的deployment
$ kubectl delete deployment nginx -n dev

第五章 Service
5.1 概述
我们已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务,虽然每个Pod都会分配一个单独的Pod的IP地址,但是却存在如下的问题:
- Pod的IP会随着Pod的重建产生变化
- Pod的IP仅仅是集群内部可见的虚拟的IP,外部无法访问

这样对于访问这个服务带来了难度,因此,Kubernetes设计了Service来解决这个问题。
Service可以看做是一组同类的Pod对外的访问接口,借助Service,应用可以方便的实现服务发现和负载均衡。
5.2 语法与示例
5.2.1 创建集群内部可访问的Service
# 语法:
# 暴露Service
# 会产生一个CLUSTER-IP,这个就是service的IP,在Service的生命周期内,这个地址是不会变化的
$ kubectl expose deployment xxx --name=服务名 --type=ClusterIP \
--port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n namespace]
# 示例:
# 暴露名为test的namespace下的名为nginx的deployment,并设置服务名为svc-nginx1
$ kubectl expose deployment nginx --name=svc-nginx1 --type=ClusterIP \
--port=80 --target-port=80 -n test

# 语法:
# 查看Service
$ kubectl get service [-n namespace] [-o wide]
# 示例:
# 查看名为test的命名空间的所有Service
# kubectl get service -n test
5.2.2 创建集群外部可访问的Service
# 语法:
# 暴露Service
# 会产生一个外部也可以访问的Service
$ kubectl expose deployment xxx --name=服务名 --type=NodePort \
--port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n namespace]
# 示例:
# 暴露名为test的namespace下的名为nginx的deployment,并设置服务名为svc-nginx2
$ kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort \
--port=80 --target-port=80 -n test

# 语法:
# 查看Service
$ kubectl get service [-n namespace] [-o wide]
# 示例:
# 查看名为test的命名空间下的所有Service
$ kubectl get service -n test
5.2.3 删除服务
# 语法:
$ kubectl delete service xxx [-n namespace]
# 示例:
$ kubectl delete service svc-nginx1 -n test
5.2.4 对象配置方式
# 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
# 创建
$ kubectl create -f svc-nginx.yaml
# 删除
$ kubectl delete -f svc-nginx.yaml
