Kubernetes控制器之ReplicaSet

  参考:https://www.jianshu.com/p/fd8d8d51741e

    https://kubernetes.io/zh/docs/concepts/workloads/controllers/replicaset/

  说到ReplicaSet对象,得先说说ReplicationController(简称为RC)。在旧版本的Kubernetes中,只有ReplicationController对象。它的主要作用是确保Pod以你指定的副本数运行,即如果有容器异常退出,会自动创建新的 Pod 来替代;而异常多出来的容器也会自动回收。可以说,通过ReplicationController,Kubernetes实现了集群的高可用性。

  在新版本的 Kubernetes 中建议使用 ReplicaSet(简称为RS )来取代 ReplicationController。ReplicaSet 跟 ReplicationController 没有本质的不同,只是名字不一样,并且 ReplicaSet 支持集合式的 selector(ReplicationController 仅支持等式)。

  虽然也 ReplicaSet 可以独立使用,但建议使用 Deployment 来自动管理 ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet 不支持 rolling-update 但 Deployment 支持),并且Deployment还支持版本记录、回滚、暂停升级等高级特性。

  1.ReplicationController的创建

  ReplicationController和Pod一样,都是Kubernetes中的对象。通过yaml或json描述文件创建一个ReplicationController。一个简单的ReplicationController如下

# cat ReplicationController.yaml 
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

   下面简要解释一下上述ReplicationController描述文件中的关键点:

  • kind字段代表你要新建的对象类型。此处指定为ReplicationController。
  • spec.selector对指定为你需要管理的Pod的label(label的意义体现在此处)。这里将spec.selector设置为app:nginx,意味着所有包含label:app:nginx的Pod都将被这个RC管理。
  • spec.replicas字段代表了受此RC管理的Pod需要运行的副本数本次设置为3。
  • template模块用于定义Pod,包括Pod名字本次是nginx,Podlabel以及Pod中运行的应用

  上面的RC通过kubectl apply命令创建成功后,Kubernetes会在所有可用的Node上,新建三个Pod。每个Pod都有一个app: nginx的label,并且每个Pod中都运行一个nginx容器。一旦其中某个Pod发生故障停止运行了,Controller Manager都能够及时发现,然后根据当前RC定义,创建出一个新的Pod,从而使包含label:app: nginx的Pod的运行副本数始终为3。

  创建ReplicationController

kubectl apply -f ReplicationController.yaml

   查看创建的RC和Pod

# kubectl get ReplicationController
NAME    DESIRED   CURRENT   READY   AGE
nginx   3         3         3       25m
[root@localhost replicaset]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
db-0                                      1/1     Running   1          3d
nfs-client-provisioner-7665588bd7-5ll74   1/1     Running   1          3d
nginx-442b2                               1/1     Running   0          26m
nginx-5pnr9                               1/1     Running   0          26m
nginx-dkjjq                               1/1     Running   0          26m
redis                                     1/1     Running   0          6h49m

 

   为该RC创建svc

# cat svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort

   解释

  • kind对应Kubernetes对象此次创建的是Service
  • metadata.name是此Service的名字可以自定义kubectl expose创建yaml文件是加参数--name= 如未自定义则默认的名称为RC名即本次的nginx
  • metadata.labels对应标签选择器对应的是labels: app:nginx
  • spec.ports.port指定后端容器的端口,本次为nginx即80端口
  • spec.port.targetPort为本Service访问入口通过该入口负载均衡之后端的3个Pod,集群内部可以通过该Service生成的IP加端口访问
  • spec.type指定外部访问模式为NodePort即随机生成外部访问端口

  可以使用命名生成此yaml文件

kubectl expose rc nginx --port=80 --target-port=80 --type=NodePort --dry-run -o yaml>svc.yaml

   应用

kubectl apply -f svc.yaml 

   查看

   可以在web页面通过nodeIP加端口访问nginx

  验证svc的targetport端口




猜你喜欢

转载自www.cnblogs.com/minseo/p/12525799.html