暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mac 上学习k8s系列(26)ReplicationController、ReplicaSet、StatefulSet

    如果说svc、pod、pv等资源是k8s的数据流,那么ReplicationController、ReplicaSet、StatefulSet便是k8s的控制流,可以控制k8s 中pod的副本数和动态伸缩。我们基于以前制作的apple:5678镜像来进行学习。

1,ReplicationController

    apiVersion: v1
    kind: ReplicationController
    metadata:
    name: apple-rctl
    labels:
    name: apple-rctl
    spec:
    replicas: 2
    selector:
    app: apple
    template:
    metadata:
    labels:
    app: apple
    spec:
    containers:
    - name: apple
    image: apple:5678
    env :
    - name : GET_HOSTS_FROM
    value : env
    ports:
    - containerPort: 5678

    RC只支持基于等式的selector(app!= apple或app!=apple)

       % kubectl apply -f deployment/ReplicationController.yaml
      replicationcontroller/apple-rc created
        % kubectl get rc  
        NAME DESIRED CURRENT READY AGE
        apple-rc   3         3         3       32s

        查看下pod,发现有两个pod已经创建成功了

          % kubectl get pod |grep apple-rctl
          apple-rctl-2hdpt 1/1 Running 0 29s
          apple-rctl-wrmwp 1/1 Running 0 15s

          2,ReplicaSet

          Replica Set还支持新的、基于集合的selector(version in (v1.0, v2.0)或env notin (dev, qa))

            apiVersion: apps/v1
            kind: ReplicaSet
            metadata:
            name: apple-rs
            spec:
            replicas: 3 #有3个副本
            selector: #标签选择器
            matchLabels:
            app: apple
            template: #模板
            metadata:
            labels:
            app: apple
            spec:
            containers:
            - name: apple-app
            image: apple:5678
            env:
            - name: GET_HOSTS_FROM
            value: dns
            ports:
            - containerPort: 5678

            中间遇到的问题

              % kubectl apply -f deployment/ReplicaSet.yaml
              error: unable to recognize "deployment/ReplicaSet.yaml": no matches for kind "ReplicaSet" in version "extensions/v1beta1"

              需要查看下当前k8s支持的版本

                %  kubectl api-versions
                admissionregistration.k8s.io/v1
                admissionregistration.k8s.io/v1beta1
                apiextensions.k8s.io/v1
                apiextensions.k8s.io/v1beta1
                apiregistration.k8s.io/v1
                apiregistration.k8s.io/v1beta1
                apps/v1
                authentication.k8s.io/v1
                authentication.k8s.io/v1beta1
                authorization.k8s.io/v1
                authorization.k8s.io/v1beta1
                autoscaling/v1
                autoscaling/v2beta1
                autoscaling/v2beta2
                batch/v1
                batch/v1beta1
                catalog.cattle.io/v1
                certificates.k8s.io/v1
                certificates.k8s.io/v1beta1
                coordination.k8s.io/v1
                coordination.k8s.io/v1beta1
                discovery.k8s.io/v1
                discovery.k8s.io/v1beta1
                events.k8s.io/v1
                events.k8s.io/v1beta1
                extensions/v1beta1
                flowcontrol.apiserver.k8s.io/v1beta1
                management.cattle.io/v3
                networking.k8s.io/v1
                networking.k8s.io/v1beta1
                node.k8s.io/v1
                node.k8s.io/v1beta1
                policy/v1
                policy/v1beta1
                rbac.authorization.k8s.io/v1
                rbac.authorization.k8s.io/v1beta1
                samplecontroller.k8s.io/v1alpha1
                scheduling.k8s.io/v1
                scheduling.k8s.io/v1beta1
                storage.k8s.io/v1
                storage.k8s.io/v1beta1
                ui.cattle.io/v1
                v1

                然后修改成对应的版本即可。

                   % kubectl apply -f deployment/ReplicaSet.yaml
                  replicaset.apps/apple-rc create

                  3,StatefulSet

                  使用statefulset需要使用对应的StorageClass,先声明一个

                    apiVersion: storage.k8s.io/v1
                    kind: StorageClass
                    metadata:
                    name: apple-nfs-storage
                    provisioner: docker.io/hostpath # or choose another name, must match deployment's env PROVISIONER_NAME' fuseim.pri/ifs 改为docker.io/hostpath
                    parameters:
                    archiveOnDelete: "false" # # When set to "false" your PVs will not be archived
                    # by the provisioner upon deletion of the PVC.

                    statefulset是有状态的,有状态的副本集都会用到持久存储,所以各个节点不能使用同一存储卷,每个节点有自已的专用存储,因此需要一个pv的模板StorageClass。

                      apiVersion: apps/v1
                      kind: StatefulSet
                      metadata:
                      name: apple-ss
                      spec:
                      selector:
                      matchLabels:
                      app: apple #必须匹配 .spec.template.metadata.labels
                      serviceName: "apple-headless" #声明它属于哪个Headless Service.
                      replicas: 3 #副本数
                      template:
                      metadata:
                      labels:
                      app: apple # 必须配置 .spec.selector.matchLabels
                      spec:
                      terminationGracePeriodSeconds: 1
                      containers:
                      - name: apple
                      image: apple:5678
                      ports:
                      - containerPort: 5678
                      name: apple
                      volumeMounts:
                      - name: apple-pvc
                      mountPath: /usr/share/apple/html


                      volumeClaimTemplates: #可看作pvc的模板
                      - metadata:
                      name: apple-pvc
                      spec:
                      accessModes: [ "ReadWriteOnce" ]
                      storageClassName: "apple-nfs-storage" #存储类名,改为集群中已存在的 apple-nfs-storage 改为docker.io/hostpath 改为 hostpath
                      resources:
                      requests:
                      storage: 1Ki

                      在StatefulSet中与之对应的headless service,headless service,即无头服务,因为是有状态的服务,希望我们每一次连接到同一个pod,关联到同一份pv存储,但是每一次重启后后pod的ip都会被重新分配,所以需要headless service,它和普通服务的区别是创建服务的时候制定 clusterIp:none,这样kubeproxy就不会做负载均衡,方便应用内部自己控制,同时给每一个pod都提供了域名,我们可以保证pod的域名重启后不变,保证了每次连接到同一个pod。

                        % kubectl apply -f deployment/StorageClass.yaml
                        storageclass.storage.k8s.io/apple-nfs-storage created
                          % kubectl apply -f deployment/statefulset.yaml
                          statefulset.apps/apple-ss created

                          启动后我们发现状态一直没有ready

                            % kubectl get statefulset
                            NAME READY AGE
                            apple-ss 0/3 22s

                            看下pod的描述信息

                              % kubectl describe pod apple-ss-0        
                              Name: apple-ss-0
                              Namespace: default
                              Priority: 0
                              Node: <none>
                              Labels: app=apple
                              controller-revision-hash=apple-ss-6bb7949cbd
                              statefulset.kubernetes.io/pod-name=apple-ss-0
                              Annotations: <none>
                              Status: Pending
                              IP:
                              IPs: <none>
                              Controlled By: StatefulSet/apple-ss
                              Containers:
                              apple:
                              Image: apple:5678
                              Port: 5678/TCP
                              Host Port: 0/TCP
                              Environment: <none>
                              Mounts:
                              usr/share/apple/html from apple-pvc (rw)
                              var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-qzvxw (ro)
                              Conditions:
                              Type Status
                              PodScheduled False
                              Volumes:
                              apple-pvc:
                              Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
                              ClaimName: apple-pvc-apple-ss-0
                              ReadOnly: false
                              kube-api-access-qzvxw:
                              Type: Projected (a volume that contains injected data from multiple sources)
                              TokenExpirationSeconds: 3607
                              ConfigMapName: kube-root-ca.crt
                              ConfigMapOptional: <nil>
                              DownwardAPI: true
                              QoS Class: BestEffort
                              Node-Selectors: <none>
                              Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                              node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
                              Events:
                              Type Reason Age From Message
                              ---- ------ ---- ---- -------
                              Warning FailedScheduling 39s default-scheduler 0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims.
                              Warning FailedScheduling 38s default-scheduler 0/1 nodes are available: 1 pod has unbound immediate PersistentVolumeClaims.

                              发现pod绑定pv出现了问题

                                1 pod has unbound immediate PersistentVolumeClaims.

                                仔细研究发现storageClass里声明的parametersfuseim.pri/ifs 在docker for mac 上不支持, 改为docker.io/hostpath就好了

                                修改后我们看下StorageClass资源

                                  % kubectl get storageclass                     
                                  NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
                                  apple-nfs-storage docker.io/hostpath Delete Immediate false 4s
                                  hostpath (default) docker.io/hostpath Delete Immediate false 104d

                                  查看我们的pod和statefullset,发现已经起来了

                                    % kubectl get pod  |grep apple-ss
                                    apple-ss-0 1/1 Running 0 64s
                                    apple-ss-1 1/1 Running 0 64s
                                    apple-ss-2                                  1/1     Running     0          62s
                                    % kubectl get statefulset
                                    NAME READY AGE
                                    apple-ss 3/3 83s


                                    文章转载自golang算法架构leetcode技术php,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                    评论