一、Pod
- 在Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod,Pod是管理,创建,计划的最小单元.一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
- 一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace。
- 一个Pod就相当于一个共享context的配置组,在同一个context下,应用可能还会有独立的cgroup隔离机制,一个Pod是一个容器环境下的“逻辑主机”,它可能包含一个或者多个紧密相连的应用,这些应用可能是在同一个物理主机或虚拟机上。
- Pod 的context可以理解成多个linux命名空间的联合:
PID 命名空间(同一个Pod中应用可以看到其它进程);
网络 命名空间(同一个Pod的中的应用对相同的IP地址和端口有权限);
IPC 命名空间(同一个Pod中的应用可以通过VPC或者POSIX进行通信);
UTS 命名空间(同一个Pod中的应用共享一个主机名称); - Pod和相互独立的容器一样,Pod是一种相对短暂的存在,而不是持久存在的,正如我们在Pod的生命周期中提到的,Pod被安排到节点上,并且保持在这个节点上直到被终止(根据重启的设定)或者被删除,当一个节点死掉之后,节点上运行的所有Pod均会被删除。
二、Namespace
- Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace。
- Namespace常用来隔离不同的用户,比如Kubernetes自带的服务一般运行在kube-system namespace中。
- Kubernetes中的名称空间与docker中的名称空间不同。K8s中的名称空间只是做了一个逻辑上的隔离
常用命令:
[root@server2 ~]# kubectl get namespaces #查看K8s中存在的名称空间
NAME STATUS AGE
default Active 12h
kube-node-lease Active 12h
kube-public Active 12h
kube-system Active 12h
#namespace包含两种状态”Active”和”Terminating”。在namespace删除过程中,namespace状态被设置成”Terminating”
[root@server2 ~]# kubectl describe namespaces default
Name: default
Labels: kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
#查看default名称空间的详细信息
[root@server2 ~]# kubectl get pod --namespace=default
No resources found in default namespace.
[root@server2 ~]# kubectl get pod -n default #查看default名称空间中的pod资源(两者都可以)
No resources found in default namespace.
[root@server2 ~]# kubectl get pod #如果不指定,则默认也是查看default名称空间中的资源
No resources found in default namespace.
三、Pod操作
1、创建删除pod
kubectl run demo --image=myapp:v1 #创建并运行demo
kubectl get pod #查看创建的demo
kubectl describe pod demo #查看详细内容
kubectl get pod -o wide #查看pod的ip
cat /var/run/flannel/subnet.env
kubectl delete pod demo #删除pod
查看node端的flannel环境:
该pod是在server3上部署的,所以处于一个网段
2、创建控制器管理pod
创建控制器,并创建两个副本控制器rs,由deployment管理副本控制器rs,rs管理pod
[root@server2 ~]# kubectl create deployment demo --image=myapp:v1 --replicas=2
deployment.apps/demo created
[root@server2 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo-5b4fc8bb88-98q5c 1/1 Running 0 18s 10.244.1.3 server3 <none> <none>
demo-5b4fc8bb88-x7nqx 1/1 Running 0 18s 10.244.2.2 server4 <none> <none>
kubectl get all #查看所有资源信息
删除创建的pod,会发现删不掉,会自动重新部署,这是因为有控制器在,想彻底删除要先删掉控制器
设置控制器对外暴露的端口为80
访问对外暴露的ip,自动实现了负载均衡
查看服务(svc:service)的具体信息,可以看到后端节点的ip
kubectl delete deployments.apps demo #删除控制器
3、pod扩容
kubectl scale deployment demo --replicas=6
kubectl get pod
减小规模
kubectl scale deployment demo --replicas=2
kubectl get pod
4、镜像更新
kubectl set image deployment demo myapp=myapp:v2
kubectl rollout history deployment demo #查看回滚历史
#如果想显示详细信息,在更新镜像时要加–record参数来记录
kubectl rollout undo deployment demo --to-revision=1 #切回版本1(注意,一个版本切一次后就会变为一个新的版本,比如我们现在切回1但其实他已经变为版本3了)
kubectl get rs
四、资源清单
- 资源清单是K8S的一种yml格式文件,按照这种文件,可以自定义的去创建K8S的资源。在kubernetes中,所有控制器,组件等都称为资源。
• apiVersion: group/version //指明api资源属于哪个群组和版本,同一个组可以有多个版本
$ kubectl api-versions //查询命令
• kind: //标记创建的资源类型,k8s主要支持以下资源类别
Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob
• metadata: //元数据
name: //对像名称
namespace: //对象属于哪个命名空间
labels: //指定资源标签,标签是一种键值数据
• spec: //定义目标资源的期望状态
• $ kubectl explain pod //查询帮助文档
示例文件:用pod.yaml 文件创建pod
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
#hostNetwork: true #直接把物理机的端口给容器用
#nodeName: server4 #使用server4作为后端
#imagePullSecrets:
containers:
- name: myapp
image: westos/game2048:latest
imagePullPolicy: IfNotPresent #优先在已有镜像的服务端创建,不再重复拉取镜像,节省资源
resources:
requests: #对cpu和mem的最低要求
cpu: "100m"
memory: "50Mi"
limits: #对cpu和mem的最高限制
cpu: "200m"
memory: "100Mi"
#ports: #指定容器所在主机需要监听的端口号,会写到iptables策略中
# - containerPort: 80
# hostPort: 80 #利用NAT把物理机的80端口影射到容器的80端口
# - name: busybox
# image: busyboxplus:latest
# imagePullPolicy: IfNotPresent
# tty: true
# stdin: true
kubectl apply -f pod.yaml #拉起pod
kubectl get pod -o wide