k8s之Pod, ReplicationController介绍
pod是k8s调度最小单位,一个pod可以包含多个容器,各容器之间共享同一个网络。
可以通过yml文件创建一个pod
apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
yml文件中各个属性
kind: 指定创建资源的角色/类型
metadata: 资源的元数据/属性
metadata下name和labels分别为
name: 资源的名字,在同一个namespace中必须唯一
labels: 设定资源的标签
spec: 指定该资源的内容
spec:#specification of the resource content 指定该资源的内容 restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器 nodeSelector: #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1 zone: node1 containers: #容器 - name: nginx #容器名字 image: nginx #镜像名字 ports: - containerPort: 80 #容器对外开放的端口
启动pod
通过Kubectl version可以查看看k8s版本
根据pod的yml文件启动一个pod
kubectl create -f pod_nginx.yml
根据当前的pod_yaml文件创建一个pod,会显示pod “nginx” created
我们通过
kubectl get pods
可以看到nginx 的pod已经运行
也可以通过
kubectl get pods -o wide
查看详细信息
NAME READY STATUS RESTARTS AGE IP NODE nginx 1/1 RUNNING 0 1m 172.17.0.4 minikube
可以看到容器 运行在minikube这个节点上, 容器的ip为172.17.0.4
我们通过minikube ssh 进入virtualbox里, 这样通过docker ps可以查看虚拟机中运行的容器
我们通过docker network list 查看 虚拟机内部的所有网络
docker network inspect bridge 查看bridge网络
可以看到bridge网络里有容器为nginx的容器网络地址为172.17.0.4,正好就是我们通过kubectl get pods -o wide获取的
除此之外,我们可以通过
kubectl exec -it nginx sh
这种方式直接进入nginx pod 里的容器里了。
如果pod中有多个容器,可以选择进入某个容器
我们可以先查看nginx pod中的容器
kubectl describe pods nginx
接下来我们可以通过-c 选项进入指定容器
kubectl exec -c 容器id
我们启动pod后,容器运行在pod中,外界无法访问,需要将pod的端口暴漏出去
kubectl port-forward nginx 8080:80
这样就将nginx容器内部的80端口映射为本机的8080端口,可以通过127.0.0.1:8080访问nginx服务了。
接下来我们删除pod
kubectl delete -f pod_nginx.yml
查看运行pod
kubectl get pods
编写yml,实例类型为ReplicationController
apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 selector: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
selector是选择器,告诉Service之间如何发现pod
teplate定义了pod格式
metadata是pod的元信息
spec指定pod内容,containers定义了容器
接下来我们启动ReplicationController
kubectl create -f rs_nginx.yml
因为我们定义了副本数量为3,所以启动三个pod
kubectl get rc
查看replicationcontroller,可以看到启动了nginx的controller
同时,我们查看下pods
kubectl get pods
当我们删除其中一个pod时,controller会重新启动一个pod,保证副本数为三个
kubectl delete pods nginx-6r92b
再次查看kubectl get pods 查看pod列表,发现pod数量仍为三个
我们也可以扩充副本数量
kubectl scale rc nginx --replicas=2
同样我们可以通过replicaset 设置启动pod
apiVersion: apps/v1 kind: ReplicaSet metadata: name: nginx labels: tier: frontend spec: replicas: 3 selector: matchLabels: tier: frontend template: metadata: name: nginx labels: tier: frontend spec: containers: - name: nginx image: nginx ports: - containerPort: 80
按照上述yml,可以通过kubectl启动yml从而根据配置的replicaset信息自动创建pod和容器。