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和容器。

posted @ 2021-01-04 15:17  恋恋风辰  阅读(269)  评论(0编辑  收藏  举报