Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace。
参考地址:pod命令行管理
实验环境:
server1作为本地仓库,server2作为master,server3,server4作为node节点
实验前要保证保证仓库正常运行
[root@server1 harbor]# docker-compose ps
[root@server2 ~]# kubectl get nod
此时要保证你所使用的镜像myapp,在本地仓库存在才行。
[root@server2 ~]# kubectl run nginx --image=myapp:v1
[root@server2 ~]# kubectl get pod
[root@server2 ~]# kubectl get pod -o wide
集群内部任意节点可以访问Pod,但集群外部无法直接访问。
[root@server2 ~]# curl 10.244.2.21
[root@server2 ~]# kubectl run demo --image=busyboxplus -it
If you don't see a command prompt, try pressing enter.
/ # ip addr
[root@server2 ~]# kubectl get pod -o wide
这时我们发现容器内的ip和容器外的ip相同
再次进入容器我们访问刚才myapp的ip,查看结果
[root@server2 ~]# kubectl attach demo -i -t
/ # curl 10.244.2.21
删除pod的命令
[root@server2 ~]# kubectl delete pod nginx
使用下面命令可以查看正在运行的pod的详细信息
[root@server2 ~]# kubectl describe pod demo
[root@server2 ~]# kubectl logs demo
一般我们不会使用刚才演示的那种单独创建的方式
[root@server2 ~]# kubectl create deployment nginx --image=myapp:v1
[root@server2 ~]# kubectl get all
这里如果我们进行删除的话,它是不会直接被删除的,他会删除之后,自动重新创建出来一个新的副本。只是随机id发生变化
[root@server2 ~]# kubectl scale deployment --replicas=2 nginx
[root@server2 ~]# kubectl get pod -o wide
service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务。
[root@server2 ~]# kubectl expose deployment nginx --port=80
[root@server2 ~]# kubectl get svc
[root@server2 ~]# curl 10.100.138.138
此时pod客户端可以通过service的名称访问后端的两个Pod
ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
[root@server2 ~]# kubectl describe svc nginx
这里的ip对应pod的副本ip
会根据副本数自动实现副本负载均衡
NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务
[root@server2 ~]# kubectl edit svc nginx
[root@server2 ~]# kubectl get svc
[root@Sun_s Desktop]# curl 172.25.1.2:30224/hostname.html
[root@server2 ~]# kubectl set image deployment nginx myapp=myapp:v2 --record #更新
[root@server2 ~]# kubectl rollout undo deployment nginx --to-revision=1 #回滚
[root@server2 ~]# kubectl rollout history deployment nginx //查看历史版本
[root@server2 ~]# curl 10.100.138.138
清单格式
apiVersion: group/version //指明api资源属于哪个群组和版本,同一个组可以有多个版本
$ kubectl api-versions //查询命令
kind: //标记创建的资源类型,k8s主要支持以下资源类别
Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob
metadata: //元数据
name: //对像名称
namespace: //对象属于哪个命名空间
labels: //指定资源标签,标签是一种键值数据
spec: //定义目标资源的期望状态
[root@server2 ~]# kubectl api-versions ## 查看所有api的版本信息
[root@server2 ~]# kubectl explain pod.spec.containers ## pod清单帮助 一层一层看
[root@server2 ~]# kubectl delete deployments.apps nginx
[root@server2 ~]# kubectl delete svc nginx
[root@server2 ~]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
spec:
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
[root@server2 ~]# kubectl apply -f pod.yml
[root@server2 ~]# kubectl get pod
[root@server2 ~]# kubectl delete -f pod.yml
[root@server2 ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 3
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
[root@server2 ~]# kubectl apply -f deployment.yml
[root@server2 ~]# kubectl get pod
[root@server2 ~]# kubectl get pod nginx-b5548c7c4-4phr9 -o yaml
[root@server2 ~]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 2
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
#nodeSelector:
# kubernetes.io/hostname: server4
nodeName: server3 #增加标签选择器
#hostNetwork: true #使用主机网络,注意端口不能冲突
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m #最小限制;十分之一cpu资源,也可以写成0.1
memory: 70Mi
limits: #上限,超出被控制器杀死
cpu: 0.5
memory: 512Mi
[root@server2 ~]# kubectl apply -f deployment.yml
[root@server2 ~]# kubectl get pod -o wide
[root@server2 ~]# kubectl describe pod
在之前的基础上再加一个容器进来
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 100m #最小限制;十分之一cpu资源,也可以写成0.1
memory: 70Mi
limits: #上限,超出被控制器杀死
cpu: 0.5
memory: 512Mi
- name: busyboxplus
image: busyboxplus
imagePullPolicy: IfNotPresent
stdin: true
tty: true
[root@server2 ~]# kubectl apply -f deployment.yml
[root@server2 ~]# kubectl get pod
[root@server2 ~]# kubectl attach nginx-585f596658-gcd89 -c busyboxplus -it
If you don't see a command prompt, try pressing enter.
/ # curl localhost
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
主要在控制器中使用,可以在节点上或pod打标签
[root@server2 ~]# kubectl get pod --show-labels #查看标签
[root@server2 ~]# kubectl label pod nginx-585f596658-gcd89 version=v1 ## 打标签
[root@server2 ~]# kubectl label pod nginx-585f596658-gcd89 version=v2 --overwrite ##更改标签
[root@server2 ~]# kubectl get pod -l version ##过滤标签
$ kubectl label nodes server2 disktype=ssd
node/server2 labeled
$ kubectl get nodes -l disktype
NAME STATUS ROLES AGE VERSION
server2 Ready <none> 6d v1.17.2
在yaml文件中增加标签选择器
nodeSelector:
disktype: ssd
参考网站:kubernetes官网
(1)Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
(2)Init 容器与普通的容器非常像,除了如下两点:
(3)如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。
Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。
Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。