美文网首页
创建deployment、service案例

创建deployment、service案例

作者: jacky_8897 | 来源:发表于2021-05-19 18:31 被阅读0次

    创建一个deployment, 此名称为test-httpd, replicas为5, 镜像使用httpd. selector是必须的

    spec.selector.matchLabels.app的value必须何metadata.name的值一致
    spec.template.metadata.labels.app的value必须何metadata.name的值一致
    spec.template.metadata.name的value可以metadata.name的值不一致

    test-hpptd.yaml 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-httpd
    spec:
      replicas: 5
      selector:
        matchLabels:
          #这个app的值必须和metadata.name的一样
          app: test-httpd
      template:
        metadata:
          # 这个name的值可以不和metadata.name的一样
          name: test-httpdx
          labels:
            #这个app的值必须和metadata.name的一样
            app: test-httpd
        spec:
          containers:
            - name: httpd
              image: httpd
              ports:
                - containerPort: 80
    

    kubectl apply -f test-httpd.yaml

    kubectl get pods
    # kubectl get pods
    NAME                         READY   STATUS              RESTARTS   AGE
    test-httpd-6dd4c6fb76-9bldc   1/1     Running             0          4s
    test-httpd-6dd4c6fb76-cfqwc   0/1     ContainerCreating   0          4s
    test-httpd-6dd4c6fb76-mrc82   0/1     ContainerCreating   0          4s
    test-httpd-6dd4c6fb76-mzzhb   0/1     ContainerCreating   0          4s
    test-httpd-6dd4c6fb76-p44v6   0/1     ContainerCreating   0          4s
    
    # get pods -o wide
    NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
    test-httpd-6dd4c6fb76-9bldc   1/1     Running   0          68s   10.244.1.17   node01   <none>           <none>
    test-httpd-6dd4c6fb76-cfqwc   1/1     Running   0          68s   10.244.1.21   node01   <none>           <none>
    test-httpd-6dd4c6fb76-mrc82   1/1     Running   0          68s   10.244.1.20   node01   <none>           <none>
    test-httpd-6dd4c6fb76-mzzhb   1/1     Running   0          68s   10.244.1.18   node01   <none>           <none>
    test-httpd-6dd4c6fb76-p44v6   1/1     Running   0          68s   10.244.1.19   node01   <none>           <none>
    

    events属于事件提示,它描述了整个资源从开始到现在所经历的全部过程。

    Deployment没有像我们想象中直接创建并控制后端的Pod,而是又创建了一个新的资源对象:ReplicaSet(test-httpd-bc546df6f )。
    Deployment--> RS(ReplicaSet)--> Pods..

    # kubectl describe deployment. test-httpd
    Name:                   test-httpd
    Namespace:              default
    CreationTimestamp:      Wed, 19 May 2021 09:01:13 +0000
    Labels:                 <none>
    Annotations:            deployment.kubernetes.io/revision: 1
    Selector:               app=test-httpd
    Replicas:               5 desired | 5 updated | 5 total | 5 available | 0 unavailable
    StrategyType:           RollingUpdate
    MinReadySeconds:        0
    RollingUpdateStrategy:  25% max unavailable, 25% max surge
    Pod Template:
      Labels:  app=test-httpd
      Containers:
       httpd:
        Image:        httpd
        Port:         80/TCP
        Host Port:    0/TCP
        Environment:  <none>
        Mounts:       <none>
      Volumes:        <none>
    Conditions:
      Type           Status  Reason
      ----           ------  ------
      Available      True    MinimumReplicasAvailable
      Progressing    True    NewReplicaSetAvailable
    OldReplicaSets:  <none>
    NewReplicaSet:   test-httpd-bc546df6f (5/5 replicas created)
    Events:
      Type    Reason             Age   From                   Message
      ----    ------             ----  ----                   -------
      Normal  ScalingReplicaSet  3m    deployment-controller  Scaled up replica set test-httpd-6dd4c6fb76 to 5
    
    查看该RS的详细信息,会看到RS整个的Events
    kubectl describe rs test-httpd-6dd4c6fb76
    Name:           test-httpd-6dd4c6fb76
    Namespace:      default
    Selector:       app=test-httpd,pod-template-hash=6dd4c6fb76
    Labels:         app=test-httpd
                    pod-template-hash=6dd4c6fb76
    Annotations:    deployment.kubernetes.io/desired-replicas: 5
                    deployment.kubernetes.io/max-replicas: 7
                    deployment.kubernetes.io/revision: 1
    Controlled By:  Deployment/test-httpd
    Replicas:       5 current / 5 desired
    Pods Status:    5 Running / 0 Waiting / 0 Succeeded / 0 Failed
    Pod Template:
      Labels:  app=test-httpd
               pod-template-hash=6dd4c6fb76
      Containers:
       httpd:
        Image:        httpd
        Port:         80/TCP
        Host Port:    0/TCP
        Environment:  <none>
        Mounts:       <none>
      Volumes:        <none>
    Events:
      Type    Reason            Age   From                   Message
      ----    ------            ----  ----                   -------
      Normal  SuccessfulCreate  68s   replicaset-controller  Created pod: test-httpd-6dd4c6fb76-fxdt5
      Normal  SuccessfulCreate  68s   replicaset-controller  Created pod: test-httpd-6dd4c6fb76-8nsmh
      Normal  SuccessfulCreate  68s   replicaset-controller  Created pod: test-httpd-6dd4c6fb76-bhjl9
      Normal  SuccessfulCreate  68s   replicaset-controller  Created pod: test-httpd-6dd4c6fb76-2fl86
      Normal  SuccessfulCreate  68s   replicaset-controller  Created pod: test-httpd-6dd4c6fb76-mt8qn
    
    查看任意一个Pod的详细信息,能够看到此Pod的完整的工作流程
    # kubectl describe pod test-httpd-6dd4c6fb76-fxdt5
    Name:         test-httpd-6dd4c6fb76-fxdt5
    Namespace:    default
    Priority:     0
    Node:         node01/172.17.0.89
    Start Time:   Wed, 19 May 2021 09:09:34 +0000
    Labels:       app=test-httpd
                  pod-template-hash=6dd4c6fb76
    Annotations:  <none>
    Status:       Running
    IP:           10.244.1.3
    IPs:
      IP:           10.244.1.3
    Controlled By:  ReplicaSet/test-httpd-6dd4c6fb76
    Containers:
      httpd:
        Container ID:   docker://03d6f36550596b83eaeb66f024f45a2faeab11e8acbf55a0c5c30d57113d7e4e
        Image:          httpd
        Image ID:       docker-pullable://httpd@sha256:e4c2b93c04762468a6cce6d507d94def02ef4dc285278d0d926e09827f4857db
        Port:           80/TCP
        Host Port:      0/TCP
        State:          Running
          Started:      Wed, 19 May 2021 09:09:49 +0000
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-dh94p (ro)
    Conditions:
      Type              Status
      Initialized       True 
      Ready             True 
      ContainersReady   True 
      PodScheduled      True 
    Volumes:
      default-token-dh94p:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-dh94p
        Optional:    false
    QoS Class:       BestEffort
    Node-Selectors:  <none>
    Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                     node.kubernetes.io/unreachable:NoExecute for 300s
    Events:
      Type    Reason     Age    From               Message
      ----    ------     ----   ----               -------
      Normal  Scheduled  3m14s  default-scheduler  Successfully assigned default/test-httpd-6dd4c6fb76-fxdt5 to node01
      Normal  Pulling    3m12s  kubelet, node01    Pulling image "httpd"
      Normal  Pulled     3m1s   kubelet, node01    Successfully pulled image "httpd"
      Normal  Created    3m     kubelet, node01    Created container httpd
      Normal  Started    2m59s  kubelet, node01    Started container httpd
    
    image.png

    创建一个Service资源,要求与上述test-httpd进行关联

    认情况下Service的资源类型Cluster IP, YAML文件中,spec.ports.port:描述的是Cluster IP的端口。
    只是为后端的Pod提供了一个统一的访问入口(在k8s集群内有效)

    vim test-httpd-svc.yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      name: test-httpd-svc
    spec:
      selector:
        app: test-httpd
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    

    kubectl apply -f test-httpd-svc.yaml

    kubectl get svc

    kubectl get svc
    NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP   13m
    test-httpd-svc   ClusterIP   10.109.147.35   <none>        80/TCP    6s
    
    # curl 10.109.147.35
    <html><body><h1>It works!</h1></body></html>
    

    如果想要让外网能够访问到后端Pod,这里应该将Service的资源类型改为NodePort。

    访问Cluster IP ,后端的Pod会轮替着为我们提供服务,也就是有负载均衡,如果没有Service资源,KUBE-PROXY组件也不会生效,因为它就是负责负载均衡,那么现在有了Service资源,它到底是怎么做到负载均衡的?底层的原理是什么?表面上来看,通过describe命令,查看SVC资源对应的Endpoint,就能够知道后端真正的Pod。

    # vim  test-httpd-svc-nodeport.yaml
    apiVersino: v1
    kind: Service
    metadata:
      name: test-httpd-svc
    spec:
      selector:
        app: test-httpd
      type: NodePort
      ports:
          - protocol: TCP
            port: 80
           targetPort: 80
           nodePort:  30080 # NodePort的端口范围: 30000 - 32767
    
    # kubectl delete svc test-httpd-svc
    # kubectl apply -f  test-httpd-svc-nodeport.yaml
    # kubectl get svc
    NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    kubernetes                ClusterIP   10.96.0.1        <none>        443/TCP        23m
    test-httpd-svc-nodeport   NodePort    10.105.227.168   <none>        80:30080/TCP   12s
    
    # kubectl describe svc test-httpd-svc-nodeport
    Name:                     test-httpd-svc-nodeport
    Namespace:                default
    Labels:                   <none>
    Annotations:              Selector:  app=test-httpd
    Type:                     NodePort
    IP:                       10.105.227.168
    Port:                     <unset>  80/TCP
    TargetPort:               80/TCP
    NodePort:                 <unset>  30080/TCP
    Endpoints:                10.244.1.3:80,10.244.1.4:80,10.244.1.5:80 + 2 more...
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:                   <none>
    
    # iptables-save |grep 10.105.227.168
    -A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.105.227.168/32 -p tcp -m comment --comment "default/test-httpd-svc-nodeport: cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
    -A KUBE-SERVICES -d 10.105.227.168/32 -p tcp -m comment --comment "default/test-httpd-svc-nodeport: cluster IP" -m tcp --dport 80 -j KUBE-SVC-5EC3ZPWMVIKQHGMU
    # #如果目标地址是10.105.227.168/32的80端口,并且走的是TCP协议,那么就把这个流量跳转到KUBE-SVC-5EC3ZPWMVIKQHGMU
    
    # iptables-save|grep 30080
    -A KUBE-NODEPORTS -p tcp -m comment --comment "default/test-httpd-svc-nodeport:" -m tcp --dport 30080 -j KUBE-MARK-MASQ
    -A KUBE-NODEPORTS -p tcp -m comment --comment "default/test-httpd-svc-nodeport:" -m tcp --dport 30080 -j KUBE-SVC-5EC3ZPWMVIKQHGMU
    
    # iptables-save|grep KUBE-SVC-5EC3ZPWMVIKQHGMU
    :KUBE-SVC-5EC3ZPWMVIKQHGMU - [0:0]
    -A KUBE-NODEPORTS -p tcp -m comment --comment "default/test-httpd-svc-nodeport:" -m tcp --dport 30080 -j KUBE-SVC-5EC3ZPWMVIKQHGMU
    -A KUBE-SERVICES -d 10.105.227.168/32 -p tcp -m comment --comment "default/test-httpd-svc-nodeport: cluster IP" -m tcp --dport 80 -j KUBE-SVC-5EC3ZPWMVIKQHGMU
    -A KUBE-SVC-5EC3ZPWMVIKQHGMU -m comment --comment "default/test-httpd-svc-nodeport:" -m statistic --mode random --probability 0.20000000019 -j KUBE-SEP-WEJ2KHPB3UGJ3Q2L
    -A KUBE-SVC-5EC3ZPWMVIKQHGMU -m comment --comment "default/test-httpd-svc-nodeport:" -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-KODG77QHMSNA4GDG
    -A KUBE-SVC-5EC3ZPWMVIKQHGMU -m comment --comment "default/test-httpd-svc-nodeport:" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-EWCOVBI4USNML6BQ
    -A KUBE-SVC-5EC3ZPWMVIKQHGMU -m comment --comment "default/test-httpd-svc-nodeport:" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-5Y2WLLQR22GOUUGX
    -A KUBE-SVC-5EC3ZPWMVIKQHGMU -m comment --comment "default/test-httpd-svc-nodeport:" -j KUBE-SEP-VVJ4XJC3AZ6CMMFS
    
    # iptables-save |grep KUBE-SEP-VVJ4XJC3AZ6CMMFS
    :KUBE-SEP-VVJ4XJC3AZ6CMMFS - [0:0]
    -A KUBE-SEP-VVJ4XJC3AZ6CMMFS -s 10.244.1.7/32 -m comment --comment "default/test-httpd-svc-nodeport:" -j KUBE-MARK-MASQ
    -A KUBE-SEP-VVJ4XJC3AZ6CMMFS -p tcp -m comment --comment "default/test-httpd-svc-nodeport:" -m tcp -j DNAT --to-destination 10.244.1.7:80
    -A KUBE-SVC-5EC3ZPWMVIKQHGMU -m comment --comment "default/test-httpd-svc-nodeport:" -j KUBE-SEP-VVJ4XJC3AZ6CMMFS
    
    

    参数说明
    SNAT: Source NAT 源地址转换
    DNAT:Destination NAT 目标地址转换
    MASQ:动态的源地址转换
    Service:实现的负载均衡:默认使用的是iptables规则;

    kubectl get pods -o wide
    NAME                          READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
    test-httpd-6dd4c6fb76-2fl86   1/1     Running   0          35m   10.244.1.6   node01   <none>           <none>
    test-httpd-6dd4c6fb76-8nsmh   1/1     Running   0          35m   10.244.1.4   node01   <none>           <none>
    test-httpd-6dd4c6fb76-bhjl9   1/1     Running   0          35m   10.244.1.5   node01   <none>           <none>
    test-httpd-6dd4c6fb76-fxdt5   1/1     Running   0          35m   10.244.1.3   node01   <none>           <none>
    test-httpd-6dd4c6fb76-mt8qn   1/1     Running   0          35m   10.244.1.7   node01   <none>           <none>
    # curl 10.244.1.6
    <html><body><h1>It works!</h1></body></html>
    # curl 10.244.1.3
    <html><body><h1>It works!</h1></body></html>
    # curl 10.244.1.5
    <html><body><h1>It works!</h1></body></html>
    
    # kubectl get svc
    NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    kubernetes                ClusterIP   10.96.0.1        <none>        443/TCP        37m
    test-httpd-svc-nodeport   NodePort    10.105.227.168   <none>        80:30080/TCP   14m
    
    # curl 10.105.227.168
    <html><body><h1>It works!</h1></body></html>
    
    # nslookup test-httpd-svc-nodeport
    Server:         127.0.0.53
    Address:        127.0.0.53#53
    # curl 127.0.0.53:30080
    <html><body><h1>It works!</h1></body></html>
    # kubectl get node -o wide
    NAME           STATUS   ROLES    AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
    controlplane   Ready    master   5m43s   v1.18.0   172.17.0.19   <none>        Ubuntu 18.04.5 LTS   4.15.0-122-generic   docker://19.3.13
    node01         Ready    <none>   5m13s   v1.18.0   172.17.0.21   <none>        Ubuntu 18.04.5 LTS   4.15.0-122-generic   docker://19.3.13
    
    # curl 172.17.0.21:30080
    <html><body><h1>It works!</h1></body></html>
    

    相关文章

      网友评论

          本文标题:创建deployment、service案例

          本文链接:https://www.haomeiwen.com/subject/mbipjltx.html