1 在Kubernetes上运行容器
- 上面讲到我们已经搭建好了Kubernetes,接下来我们先使用命令行在上运行一个容器
kubectl run nginx --image=nginx #运行一个容器
kubectl get pod nginx #查看容器的运行状态等信息
kubectl describe pod nginx #查看创建好的容器的详细信息
- 集群内部任意节点可以访问pod,但集群外部无法访问
kubectl run test -it --image=busyboxplus --restart=Never
curl 10.244.2.3
2 Pod管理
- Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip
- 一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace
两种创建pod的方式
- 自主式创建pod
这种方式创建的pod,如果你删除之后,它就会永久的消失
kubectl run nginx --image=nginx
kubectl get pod #查看创建的pod状态等信息
kubectl delete pod nginx #删除创建的pod
kubectl get pod
- 采用deployment的方式来创建pod
这种方式不同于自主式创建pod的区别在于,你删除pod后,它会自己再重新创建一个pod,只是名称不同而已,而且使用deployment方式创建的pod,还可以做拉伸,进行自动维护。
kubectl create deployment nginx --image=nginx
kubectl get pod
kubectl delete pod nginx
kubectl get pod
kubectl scale --replicas=2 deployment nginx #做拉伸(也就是再创建复制一个pod,但是会运行在不同的节点上)
kubectl get pod -o wide
Service(创建service,可以在集群内部来访问我们的服务)
- service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务
创建service
kubectl expose deployment nginx --port=80 --target-port=80
kubectl get deployments.apps
kubectl describe svc nginx #查看创建的nginx服务的详细信息
kubectl get svc -o wide #查看创建的服务
注意:通过expose命令,此时pod客户端可以通过service的名称访问后端的两个Pod
对服务进行访问(也是在集群内进行访问)
通过ClusterIP的方式来访问,但是也只是在集群内部来进行访问,=集群外部依旧不能直接访问
kubectl run test -it --image=busyboxplus
kubectl attach test -it
通过NodePort类型,在Pod所在的节点进行绑定端口,让外部客户端访问Pod
NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务
首先将我们创建好的service进行修改,修改service的type为NodePort
kubectl edit svc nginx #修改我们已经创建好的nginx,使其type为NodePort
查看pod所在节点的虚拟机的端口情况
kubectl get pod -o wide #查看nginx所在的节点位置
kubectl get svc nginx #查看服务在节点上绑定的端口
我们在server2和server3上查看端口的情况
netstat -antlp
通过NodeIP:NodePort的方式在集群外部来进行访问
curl 192.168.43.102:32580
curl 192.168.43.103:32580
3 资源清单
格式如下:
-
apiVersion: group/version //指明api资源属于哪个群组和版本,同一个组可以有多个版本
$ kubectl api-versions //查询命令 -
kind: //标记创建的资源类型,k8s主要支持以下资源类别
Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob -
metadata: //元数据
name: //对像名称
namespace: //对象属于哪个命名空间
labels: //指定资源标签,标签是一种键值数据 -
spec: //定义目标资源的期望状态
一些参数以及说明
- 编辑资源清单文件
mkdir manifest
vim /maniest/pod.yaml
1 apiVersion: v1
2 kind: Pod
3 metadata:
4 name: nginx
5 spec:
6 containers:
7 - name: nginx
8 image: nginx
9 imagePullPolicy: IfNotPresent
- 创建pod
kubectl create -f pod.yaml
kubectl get pod
- 删除pod,使用资源清单创建的pod,我们在删除pod时,可以直接删除其资源清单文件
kubectl delete -f pod.yaml #删除清单,同时会删除利用清单创建的pod
kubectl get pod
- 用一个pod创建两个容器
vim pod.yaml
1 apiVersion: v1
2 kind: Pod
3 metadata:
4 name: nginx
5 spec:
6 containers:
7 - name: nginx
8 image: nginx
9 imagePullPolicy: IfNotPresent
10 - name: busyboxplus
11 image: reg.westos.org:5000/busyboxplus
12 imagePullPolicy: IfNotPresent
13 tty: true
kubectl get pod
kubectl describe pod nginx #查看这个pod中两个容器的具体情况
- 因为我们在一个pod中创建了我两个容器,且有一个容器为busyboxplus,通过前面的学习,同一Pod中的容器是可以进行通信的
kubectl exec -it nginx -c busyboxplus -- sh #以交互式的方式连接创建好的busyboxplus容器