zoukankan      html  css  js  c++  java
  • 4、kubernetes应用入门

    本随笔接前两两章,建立离master主节点和node01、node02、node03三个节点

    kubectl子命令

    master ~]# kubectl

    kubectl controls the Kubernetes cluster manager.
    
     Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
    
    Basic Commands (Beginner):
      create         Create a resource from a file or from stdin.  //增
      expose         Take a replication controller, service, deployment or pod and expose it as a new Kubernetes Service
      run            Run a particular image on the cluster
      set            Set specific features on objects
    
    Basic Commands (Intermediate):
      explain        Documentation of resources
      get            Display one or many resources    //查
      edit           Edit a resource on the server    //改
      delete         Delete resources by filenames, stdin, resources and names, or by resources and label selector   //删除
    
    Deploy Commands:
      rollout        Manage the rollout of a resource  //滚动
      scale          Set a new size for a Deployment, ReplicaSet, Replication Controller, or Job  //手动改变应用程序的规模
      autoscale      Auto-scale a Deployment, ReplicaSet, or ReplicationController  //自动改变,即创建HPA
    
    Cluster Management Commands:  //集群管理
      certificate    Modify certificate resources.
      cluster-info   Display cluster info   //集群信息
      top            Display Resource (CPU/Memory/Storage) usage.  
      cordon         Mark node as unschedulable  //标记一个节点不可被调用
      uncordon       Mark node as schedulable   //标记节点可被调用
      drain          Drain node in preparation for maintenance
      taint          Update the taints on one or more nodes  //给节点增加污点,作用是控制是否被调用
    
    Troubleshooting and Debugging Commands:   
      describe       Show details of a specific resource or group of resources  //描述资源的详细信息,例如 master ~]# kubectl describe node node01
      logs           Print the logs for a container in a pod
      attach         Attach to a running container
      exec           Execute a command in a container
      port-forward   Forward one or more local ports to a pod
      proxy          Run a proxy to the Kubernetes API server
      cp             Copy files and directories to and from containers.
      auth           Inspect authorization
    
    Advanced Commands:
      diff           Diff live version against would-be applied version
      apply          Apply a configuration to a resource by filename or stdin
      patch          Update field(s) of a resource using strategic merge patch
      replace        Replace a resource by filename or stdin
      wait           Experimental: Wait for a specific condition on one or many resources.
      convert        Convert config files between different API versions
      kustomize      Build a kustomization target from a directory or a remote url.
    
    Settings Commands:
      label          Update the labels on a resource
      annotate       Update the annotations on a resource
      completion     Output shell completion code for the specified shell (bash or zsh)
    
    Other Commands:
      api-resources  Print the supported API resources on the server
      api-versions   Print the supported API versions on the server, in the form of "group/version"
      config         Modify kubeconfig files
      plugin         Provides utilities for interacting with plugins.
      version        Print the client and server version information
    
    Usage:
      kubectl [flags] [options]
    
    Use "kubectl <command> --help" for more information about a given command.
    Use "kubectl options" for a list of global command-line options (applies to all commands).

    描述一个资源的详细信息

    [root@master ~]# kubectl describe node master
    Name:               master
    Roles:              master
    Labels:             beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/os=linux
                        kubernetes.io/arch=amd64
                        kubernetes.io/hostname=master
                        kubernetes.io/os=linux
                        node-role.kubernetes.io/master=
    Annotations:        flannel.alpha.coreos.com/backend-data: {"VtepMAC":"2e:6c:70:78:ed:70"}
                        flannel.alpha.coreos.com/backend-type: vxlan
                        flannel.alpha.coreos.com/kube-subnet-manager: true
                        flannel.alpha.coreos.com/public-ip: 192.168.184.141
                        kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                        node.alpha.kubernetes.io/ttl: 0
                        volumes.kubernetes.io/controller-managed-attach-detach: true
    CreationTimestamp:  Fri, 31 May 2019 20:34:59 +0800
    Taints:             node-role.kubernetes.io/master:NoSchedule   //表示只要不是master的组件都不能调度到master上
    Unschedulable:      false
    Conditions:
      Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
      ----             ------  -----------------                 ------------------                ------                       -------
      MemoryPressure   False   Mon, 03 Jun 2019 22:20:17 +0800   Fri, 31 May 2019 20:34:53 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
      DiskPressure     False   Mon, 03 Jun 2019 22:20:17 +0800   Fri, 31 May 2019 20:34:53 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
      PIDPressure      False   Mon, 03 Jun 2019 22:20:17 +0800   Fri, 31 May 2019 20:34:53 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
      Ready            True    Mon, 03 Jun 2019 22:20:17 +0800   Mon, 03 Jun 2019 22:06:07 +0800   KubeletReady                 kubelet is posting ready status
    Addresses:
      InternalIP:  192.168.184.141
      Hostname:    master
    Capacity:
     cpu:                4
     ephemeral-storage:  12786Mi
     hugepages-1Gi:      0
     hugepages-2Mi:      0
     memory:             1867048Ki
     pods:               110
    Allocatable:
     cpu:                4
     ephemeral-storage:  12066383443
     hugepages-1Gi:      0
     hugepages-2Mi:      0
     memory:             1764648Ki
     pods:               110
    System Info:
     Machine ID:                 45c658713b3b423387314d097b36aa61
     System UUID:                7C8C4D56-7732-E896-C85E-040A2FCEF804
     Boot ID:                    474da659-6243-4a63-a5f9-2e436260b3d2
     Kernel Version:             3.10.0-693.el7.x86_64
     OS Image:                   CentOS Linux 7 (Core)
     Operating System:           linux
     Architecture:               amd64
     Container Runtime Version:  docker://18.9.6
     Kubelet Version:            v1.14.2
     Kube-Proxy Version:         v1.14.2
    PodCIDR:                     10.244.0.0/24
    Non-terminated Pods:         (8 in total)
      Namespace                  Name                              CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
      ---------                  ----                              ------------  ----------  ---------------  -------------  ---
      kube-system                coredns-fb8b8dccf-42b7j           100m (2%)     0 (0%)      70Mi (4%)        170Mi (9%)     3d1h
      kube-system                coredns-fb8b8dccf-bjv95           100m (2%)     0 (0%)      70Mi (4%)        170Mi (9%)     3d1h
      kube-system                etcd-master                       0 (0%)        0 (0%)      0 (0%)           0 (0%)         3d1h
      kube-system                kube-apiserver-master             250m (6%)     0 (0%)      0 (0%)           0 (0%)         3d1h
      kube-system                kube-controller-manager-master    200m (5%)     0 (0%)      0 (0%)           0 (0%)         3d1h
      kube-system                kube-flannel-ds-amd64-w4jfh       100m (2%)     100m (2%)   50Mi (2%)        50Mi (2%)      2d18h
      kube-system                kube-proxy-f88gd                  0 (0%)        0 (0%)      0 (0%)           0 (0%)         3d1h
      kube-system                kube-scheduler-master             100m (2%)     0 (0%)      0 (0%)           0 (0%)         3d1h
    Allocated resources:
      (Total limits may be over 100 percent, i.e., overcommitted.)
      Resource           Requests     Limits
      --------           --------     ------
      cpu                850m (21%)   100m (2%)
      memory             190Mi (11%)  390Mi (22%)
      ephemeral-storage  0 (0%)       0 (0%)
    Events:
      Type    Reason                   Age   From             Message
      ----    ------                   ----  ----             -------
      Normal  Starting                 14m   kubelet, master  Starting kubelet.
      Normal  NodeHasSufficientMemory  14m   kubelet, master  Node master status is now: NodeHasSufficientMemory
      Normal  NodeHasNoDiskPressure    14m   kubelet, master  Node master status is now: NodeHasNoDiskPressure
      Normal  NodeHasSufficientPID     14m   kubelet, master  Node master status is now: NodeHasSufficientPID
      Normal  NodeNotReady             14m   kubelet, master  Node master status is now: NodeNotReady
      Normal  NodeAllocatableEnforced  14m   kubelet, master  Updated Node Allocatable limit across pods
      Normal  NodeReady                14m   kubelet, master  Node master status is now: NodeReady
    [root@master ~]# kubectl version  //查看客户端和服务器端的版本
    Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.2", GitCommit:"66049e3b21efe110454d67df4fa62b08ea79a19b", GitTreeState:"clean", 
    BuildDate:"2019-05-16T16:23:09Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.2", GitCommit:"66049e3b21efe110454d67df4fa62b08ea79a19b", GitTreeState:"clean",
    BuildDate:"2019-05-16T16:14:56Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}
    [root@master ~]# kubectl cluster-info   //查看集群信息
    Kubernetes master is running at https://192.168.184.141:6443   //向外输出的API Server地址 
    KubeDNS is running at https://192.168.184.141:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy  
    //相当于CoreDNS,运行获取路径时,从集群外部访问的执行端口转发的代理的访问方式
    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

    三个重要的附件:kube-proxy、CoreDNS、flannel

    如何对k8s集群进行增删改查

    [root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true
    kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. 
    Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/nginx-deploy created (dry run) //deployment.apps表示类别,在deployment控制器下控制的应用程序apps,叫nginx-deploy
    [root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1
    kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
    deployment.apps/nginx-deploy created
    [root@master ~]# kubectl get deployment
    NAME           READY   UP-TO-DATE   AVAILABLE   AGE
    nginx-deploy   1/1     1            1           88s
    [root@master ~]# kubectl get pods
    NAME                           READY   STATUS    RESTARTS   AGE
    nginx-deploy-55d8d67cf-r45d4   1/1     Running   0          3m12s   //nginx-deploy(名称)-55d8d67cf-r45d4(hash码)
    [root@master ~]# kubectl get pods -o wide
    NAME                           READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
    nginx-deploy-55d8d67cf-r45d4   1/1     Running   0          5m26s   10.244.1.2   node03   <none>           <none>
    [root@node03 ~]# ifconfig
    cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450   //创建的pod属于cni0桥
            inet 10.244.1.1  netmask 255.255.255.0  broadcast 0.0.0.0  //这里是24为掩码,即10.244.1是网络地址,是整个大网10.244.0.0的子网,10.244.1.0/24专供node03上的pod使用
            inet6 fe80::2865:d6ff:fec3:8c48  prefixlen 64  scopeid 0x20<link>
            ether 2a:65:d6:c3:8c:48  txqueuelen 1000  (Ethernet)
            RX packets 1  bytes 28 (28.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8  bytes 648 (648.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500   //创建的pod地址不属于docker0桥的
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
            ether 02:42:fa:b6:01:67  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
            inet 10.244.1.0  netmask 255.255.255.255  broadcast 0.0.0.0
            inet6 fe80::8cfe:edff:fe64:fa7  prefixlen 64  scopeid 0x20<link>
            ether 8e:fe:ed:64:0f:a7  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 8 overruns 0  carrier 0  collisions 0
    [root@node02 ~]# ifconfig   //没有cni0桥是因为这里还没有创建pod
    docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
            ether 02:42:0f:c0:cc:e7  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0。。。。
    
    flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
            inet 10.244.2.0  netmask 255.255.255.255  broadcast 0.0.0.0    //子网:10.244.2.0/24专供node02上的pod使用
            inet6 fe80::80c1:b0ff:fe56:d03c  prefixlen 64  scopeid 0x20<link>
            ether 82:c1:b0:56:d0:3c  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 8 overruns 0  carrier 0  collisions 0
    [root@node01 ~]# ifconfig
    docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
            ether 02:42:7d:52:0a:23  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
            inet 10.244.3.0  netmask 255.255.255.255  broadcast 0.0.0.0   //子网:10.244.3.0/24专供node01上的pod使用
            inet6 fe80::909c:12ff:fe96:2258  prefixlen 64  scopeid 0x20<link>
            ether 92:9c:12:96:22:58  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 8 overruns 0  carrier 0  collisions 0
    [root@node01 ~]# curl 10.244.1.2   //pod运行在node03上,但是在node01、master、node02上都是可以访问的
    <!DOCTYPE html>   //因为master、node01、node02和node03都处于同一网段中,但是pod的地址只能在k8s集群内部使用;
    <html>            //pod的客户端分为两类:1、其他pod,2、集群外部的客户端
    <head>
    <title>Welcome to nginx!</title>
    <style>
    。。。。。。。
    [root@master ~]# kubectl get pod   //已存在的pod
    NAME                           READY   STATUS    RESTARTS   AGE
    nginx-deploy-55d8d67cf-r45d4   1/1     Running   0          58m
    [root@master
    ~]# kubectl delete pod nginx-deploy-55d8d67cf-r45d4 //删除pod pod "nginx-deploy-55d8d67cf-r45d4" deleted
    [root@master
    ~]# kubectl get pod //删除后会立马创建新的pod,引文pod资源是控制器管理的,如果pod资源不够时,控制器会自动创建一个新的pod NAME READY STATUS RESTARTS AGE nginx-deploy-55d8d67cf-tfppt 0/1 ContainerCreating 0 6s
    [root@master
    ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deploy-55d8d67cf-tfppt 1/1 Running 0 5m45s 10.244.2.2 node02 <none> <none>
    //这次是创建在node02上,但是node02由于没有镜像,所以要先下载镜像
    node02 ~]# ifconfig     //上述将已经存在的pod删除后,又新建一个pod,这样就改变了pod的IP,但是服务仍然存在,所以以IP地址访问是不可以的,因此应该给pod一个固定端点,
    cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450    //当客户端访问时,只需要访问它的固定端点,固定端点由service提供。
            inet 10.244.2.1  netmask 255.255.255.0  broadcast 0.0.0.0
            inet6 fe80::1cf7:fcff:fe37:bfd2  prefixlen 64  scopeid 0x20<link>
            ether 1e:f7:fc:37:bf:d2  txqueuelen 1000  (Ethernet)
            RX packets 1  bytes 28 (28.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8  bytes 648 (648.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
            inet 10.244.2.0  netmask 255.255.255.255  broadcast 0.0.0.0
            inet6 fe80::80c1:b0ff:fe56:d03c  prefixlen 64  scopeid 0x20<link>
            ether 82:c1:b0:56:d0:3c  txqueuelen 0  (Ethernet)
            RX packets 6  bytes 1158 (1.1 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8  bytes 506 (506.0 B)
            TX errors 0  dropped 8 overruns 0  carrier 0  collisions 0

    master ~]# kubectl expose --help   //expose暴漏的端口(创建或者代理) 是service_port

    Usage:
      kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name]   //[--port=port]指service的端口
    [--name=name] [--external-ip=external-ip-of-service] [--type=type] [options] //[--name=name]是service的名称,[--type=type]是service的类型
    [--port=port]指服务的端口(service有自己的地址),[--target-port=number-or-name]目标端口是pod的端口
    service是为pod提供一个固定访问端点,但这个端点不支持外部访问,只能在集群内部的节点上才能被访问,这种端点大多时候是被pod客户端访问的。pod客户端在访问
    服务时,是可以基于service的名称来访问的(IP地址是动态生成的),但是pod客户端必须能解析这个service名称。解析时就需要依赖CoreDNS服务。

    service只有一个servic IP,只能在集群内被各pod客户端访问,而不能突破集群边界,被集群外部的客户端访问

    master ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP 
    service/nginx exposed //nginx是服务名称,是nginx-deploy创建的pod资源
    //deployment是控制器,将控制器相关的pod资源即nginx-deployment创建为一个服务,服务名是nginx。
    [root@master ~]# kubectl get svc  //svc是service的缩写,查看创建的服务
    NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   3d15h
    nginx        ClusterIP   10.96.75.49   <none>        80/TCP    2m41s 
    service是为pod提供一个固定访问端点,但这个端点不支持外部访问,只能在集群内部的节点上才能被访问,这种端点大多时候是被pod客户端访问的。
    pod客户端在访问服务时,是可以基于service的名称来访问的(IP地址是动态生成的),但是pod客户端必须能解析这个service名称。
    解析时就需要依赖CoreDNS服务。CoreDNS地址是可以查询的,但一般并不会直接使用地址,而是使用CoreDNS的服务名称。
    master ~]# kubectl get pods -n kube-system -o wide
    NAME                             READY   STATUS    RESTARTS   AGE     IP                NODE     NOMINATED NODE   READINESS GATES
    coredns-fb8b8dccf-42b7j          1/1     Running   0          3d15h   10.244.0.2        master   <none>           <none>
    coredns-fb8b8dccf-bjv95          1/1     Running   0          3d15h   10.244.0.3        master   <none>           <none>
    etcd-master                      1/1     Running   1          3d15h   192.168.184.141   master   <none>           <none>
    kube-apiserver-master            1/1     Running   1          3d15h   192.168.184.141   master   <none>           <none>
    kube-controller-manager-master   1/1     Running   4          3d15h   192.168.184.141   master   <none>           <none>
    kube-flannel-ds-amd64-4z7ht      1/1     Running   0          18h     192.168.184.144   node03   <none>           <none>
    kube-flannel-ds-amd64-k4rxq      1/1     Running   0          18h     192.168.184.142   node01   <none>           <none>
    kube-flannel-ds-amd64-w4jfh      1/1     Running   0          3d8h    192.168.184.141   master   <none>           <none>
    kube-flannel-ds-amd64-ztbm6      1/1     Running   2          2d21h   192.168.184.143   node02   <none>           <none>
    kube-proxy-f88gd                 1/1     Running   1          3d15h   192.168.184.141   master   <none>           <none>
    kube-proxy-kvd9x                 1/1     Running   0          18h     192.168.184.144   node03   <none>           <none>
    kube-proxy-qqhpx                 1/1     Running   0          18h     192.168.184.142   node01   <none>           <none>
    kube-proxy-zsnz5                 1/1     Running   2          2d21h   192.168.184.143   node02   <none>           <none>
    kube-scheduler-master            1/1     Running   3          3d15h   192.168.184.141   master   <none>           <none>
    [root@master ~]# kubectl get svc -n kube-system  //查看kube-system名称空间中的服务
    NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
    kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   3d15h

    为了演示效果CoreDNS解析效果,再启动一个pod作为客户端使用

    [root@master ~]# kubectl run client --image=busybox --replicas=1 -it --restart=Never
    If you don't see a command prompt, try pressing enter.
    / # cat /etc/resolv.conf
    nameserver 10.96.0.10   //IP解析地址指向10.96.0.10
    search default.svc.cluster.local svc.cluster.local cluster.local  //svc.cluster.local表示k8s集群的本地pod资源的特定后缀,default表示pod所属的名称空间的名字,
    options ndots:5 / # //所以如果基于服务的名称进行解析时,一定要使用完整的服务名称。如果服务名称不完整,搜索域是不一样的

    master ~]# yum install bind-utils

    master ~]# dig -t A nginx.default.svc.cluster.local @10.96.0.10   //根据服务全名,通过CoreDNS服务将service的IP解析出来
    
    ; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> -t A nginx.default.svc.cluster.local @10.96.0.10
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33271
    ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
    ;; WARNING: recursion requested but not available
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;nginx.default.svc.cluster.local. IN    A
    
    ;; ANSWER SECTION:
    nginx.default.svc.cluster.local. 5 IN    A    10.96.75.49   //根据service服务(nginx)名称将service的IP解析出来
    
    ;; Query time: 72 msec
    ;; SERVER: 10.96.0.10#53(10.96.0.10)
    ;; WHEN: Tue Jun 04 12:47:39 CST 2019
    ;; MSG SIZE  rcvd: 107
    [root@master ~]# kubectl run client --image=busybox --replicas=1 -it --restart=Never
    If you don't see a command prompt, try pressing enter.
    / # cat /etc/resolv.conf
    nameserver 10.96.0.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
    / # wget nginx
    Connecting to nginx (10.96.75.49:80)   //根据service名称解析出来service的IP
    index.html           100% |***********************************************************************************************|   612  0:00:00 ETA
    / # wget -O - -q http://nginx:80/  //此时这里的80端口被调度到pod的port上
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    </html>

    下面将pod手动宕机,测试使用同一个service名称(nginx)是否还可以访问

    [root@master ~]# kubectl get pods  //查询pod的名称
    NAME                           READY   STATUS    RESTARTS   AGE
    client                         1/1     Running   0          36m
    nginx-deploy-55d8d67cf-tfppt   1/1     Running   0          5h35m
    [root@master ~]# kubectl delete pods nginx-deploy-55d8d67cf-tfppt   //删除pod
    pod "nginx-deploy-55d8d67cf-tfppt" deleted
    [root@master ~]# kubectl get pods   再次查看,控制器已经新建了一个pod
    NAME                           READY   STATUS              RESTARTS   AGE
    client                         1/1     Running             0          36m
    nginx-deploy-55d8d67cf-hlj9v   0/1     ContainerCreating   0          11s
    [root@master ~]# kubectl get pods   //新建的pod已经运行
    NAME                           READY   STATUS    RESTARTS   AGE
    client                         1/1     Running   0          37m
    nginx-deploy-55d8d67cf-hlj9v   1/1     Running   0          37s
    / # wget -O - -q http://nginx:80/   //再次使用service服务的名称进行访问nginx服务,还是可以访问的,这就是通过标签和标签选择器关联pod资源,而不是基于IP地址来选择的。
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    </body>
    master ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP 
    上述实验说明了只要是nginx-deploy创建的pod,一律都纳入到服务的后端中去,这就是service可以为pod提供固定的访问端点。
    service是iptables规则或者ipvs规则
    [root@master ~]# kubectl get pods -o wide  //目前服务运行在node01上,但是在其他节点(node02或node03)都是可以查看相关规则的
    NAME                           READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
    client                         1/1     Running   0          6h12m   10.244.1.3   node03   <none>           <none>
    nginx-deploy-55d8d67cf-hlj9v   1/1     Running   0          5h36m   10.244.3.2   node01   <none>           <none> 
    [root@master ~]# kubectl get svc  //主要关注的不是pod自身,而是svc,service生成后即nginx会生成iptables或ipvs规则,把所有访问10.96.75.49:80的都调度至
    NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE          //nginx用标签选择器关联到的各pod后端。
    kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d22h
    nginx ClusterIP
    10.96.75.49 <none> 80/TCP 6h45m

    如何查看标签选择器关联到哪些客户端?

    [root@master ~]# kubectl describe svc nginx    //下面显示的资源都是可以被改变的
    Name:              nginx
    Namespace:         default
    Labels:            run=nginx-deploy
    Annotations:       <none>
    Selector:          run=nginx-deploy   //选择器选择那些所有拥有run标签,且值=nginx-deploy的pod资源
    Type:              ClusterIP 
    IP:                10.96.75.49  //比如IP地址改变后,解析结果也会自动修改,这里的变化会立即CoreDNS的解析记录当中,如果把这个服务删除了,这个地址也是发生变化的
    Port:              <unset>  80/TCP
    TargetPort:        80/TCP
    Endpoints:         10.244.3.2:80  //如果pod资源被删除,这里会发生相应的变化
    Session Affinity:  None
    Events:            <none>
    [root@master ~]# kubectl get pods --show-labels
    NAME                           READY   STATUS    RESTARTS   AGE     LABELS
    client                         1/1     Running   0          7h4m    run=client
    nginx-deploy-55d8d67cf-hlj9v   1/1     Running   0          6h27m   pod-template-hash=55d8d67cf,run=nginx-deploy 
    //当此标签被删除时,再创建是依然要有此标签才能被选中,而不是根据IP地址被选中

    首先使用kubectl run创建一个pod,比如这个pod运行的是nginx,此时nginx只能对集群内的节点提供访问功能,集群外的节点是无法访问的;所以就需要创建一个service,由service通过pod的标签关联pod,然后对集群外部提供服务。

    以上就是service的意义

    控制器是根据标签选择器来关联到pod资源上的
    [root@master]# kubectl describe deployment nginx-deploy Name: nginx-deploy Namespace: default CreationTimestamp: Tue, 04 Jun 2019 06:32:12 +0800 Labels: run=nginx-deploy Annotations: deployment.kubernetes.io/revision: 1 Selector: run=nginx-deploy Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: run=nginx-deploy Containers: nginx-deploy: Image: nginx:1.14-alpine Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Progressing True NewReplicaSetAvailable Available True MinimumReplicasAvailable OldReplicaSets: <none> NewReplicaSet: nginx-deploy-55d8d67cf (1/1 replicas created) Events: <none>

    一个创建好的deployment控制器的副本数量是可以动态修改的

    [root@master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2  //创建新的控制器,副本是2
    kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
    deployment.apps/myapp created

    [root@master ~]# kubectl get deployment  

    NAME           READY   UP-TO-DATE   AVAILABLE   AGE
    myapp          2/2     2            2           5m38s
    nginx-deploy   1/1     1            1           10d
    [root@master ~]# kubectl get deployment -w   //-w表示监控
    NAME           READY   UP-TO-DATE   AVAILABLE   AGE
    myapp          2/2     2            2           95s
    nginx-deploy   1/1     1            1           10d

    [root@master ~]# kubectl get pods -o wide  //新创建的pod在不同的节点上,同时他们的网络也是不同的

    NAME                           READY   STATUS      RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
    client                         0/1     Error       0          9d      <none>       node03   <none>           <none>
    client1                        0/1     Completed   0          9d      10.244.2.3   node02   <none>           <none>
    myapp-5bc569c47d-24qfh         1/1     Running     0          7m29s   10.244.2.4   node02   <none>           <none>
    myapp-5bc569c47d-7ql96         1/1     Running     0          7m29s   10.244.1.4   node03   <none>           <none>
    nginx-deploy-55d8d67cf-hlj9v   1/1     Running     3          9d      10.244.3.5   node01   <none>           <none>
    [root@master ~]# kubectl run client2 --image=busybox --replicas=1 -it --restart=Never //应该为pod提供固定的访问端点,即service
    If you don't see a command prompt, try pressing enter.
    / # wget -O - -q 10.244.2.4
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    / # wget -O - -q 10.244.1.4
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    / # wget -O - -q 10.244.1.4/hostname.html
    myapp-5bc569c47d-7ql96
    / # wget -O - -q 10.244.2.4/hostname.html
    myapp-5bc569c47d-24qfh

    为pod创建固定访问端点

    [root@master ~]# kubectl expose deployment myapp --name=myapp --port=80
    service/myapp exposed
    [root@master ~]# kubectl get svc
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   13d
    myapp        ClusterIP   10.96.152.130   <none>        80/TCP    7s
    nginx        ClusterIP   10.96.75.49     <none>        80/TCP    9d

    随机调度不同节点上的pod

    / # wget -O - -q myapp
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    / # wget -O - -q myapp/hostname.html
    myapp-5bc569c47d-7ql96
    / # wget -O - -q myapp/hostname.html
    myapp-5bc569c47d-24qfh
    / # wget -O - -q myapp/hostname.html
    myapp-5bc569c47d-24qfh
    / # wget -O - -q myapp/hostname.html
    myapp-5bc569c47d-7ql96
    / # wget -O - -q myapp/hostname.html
    myapp-5bc569c47d-24qfh
    / # wget -O - -q myapp/hostname.html
    myapp-5bc569c47d-7ql96
    / # while true; do wget -O - -q myapp/hostname.html; sleep 1; done
    myapp-5bc569c47d-7ql96
    myapp-5bc569c47d-24qfh
    myapp-5bc569c47d-24qfh
    myapp-5bc569c47d-7ql96
    myapp-5bc569c47d-24qfh
    myapp-5bc569c47d-7ql96

    pod是动态变动的,可以进行扩展或者缩小

    master ~]# kubectl scale --help

    Usage:
      kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)
    master ~]# kubectl scale --replicas=5 deployment myapp   //将控制器myapp的副本数量增加到5
    deployment.extensions/myapp scaled
    [root@master ~]# kubectl get pods   //查看副本是五个
    NAME                           READY   STATUS             RESTARTS   AGE
    client                         0/1     Error              0          9d
    client1                        0/1     Completed          0          9d
    client2                        1/1     Running            0          65m
    myapp-5bc569c47d-24qfh         1/1     Running            0          75m
    myapp-5bc569c47d-7ql96         1/1     Running            0          75m
    myapp-5bc569c47d-bdpxf         1/1     Running            0          69s
    myapp-5bc569c47d-ftrgc         1/1     Running            0          69s
    myapp-5bc569c47d-qlk7f         0/1     Running            0          69s
    nginx-deploy-55d8d67cf-hlj9v   1/1     Running            3          9d
    / # while true; do wget -O - -q myapp/hostname.html; sleep 1; done  //这里可以把5个pod都可以访问到
    myapp-5bc569c47d-ftrgc
    myapp-5bc569c47d-24qfh
    myapp-5bc569c47d-ftrgc
    myapp-5bc569c47d-bdpxf
    myapp-5bc569c47d-qlk7f
    myapp-5bc569c47d-qlk7f
    myapp-5bc569c47d-7ql96
    myapp-5bc569c47d-bdpxf
    myapp-5bc569c47d-qlk7f
    myapp-5bc569c47d-qlk7f
    myapp-5bc569c47d-7ql96

    [root@master ~]# kubectl scale --replicas=3 deployment myapp  //缩减pod副本数量
    deployment.extensions/myapp scaled

    [root@master ~]# kubectl get pods   
    NAME                           READY   STATUS      RESTARTS   AGE
    client                         0/1     Error       0          9d
    client1                        0/1     Completed   0          9d
    client2                        0/1     Error       0          78m
    client3                        1/1     Running     0          2m46s
    myapp-5bc569c47d-24qfh         1/1     Running     0          88m
    myapp-5bc569c47d-7ql96         1/1     Running     0          88m
    myapp-5bc569c47d-bdpxf         1/1     Running     0          14m
    nginx-deploy-55d8d67cf-hlj9v   1/1     Running     3          9d
    / # while true; do wget -O - -q myapp/hostname.html; sleep 1; done   //缩减后只调度剩下三个pod
    myapp-5bc569c47d-24qfh
    myapp-5bc569c47d-7ql96
    myapp-5bc569c47d-7ql96
    myapp-5bc569c47d-bdpxf
    myapp-5bc569c47d-24qfh
    myapp-5bc569c47d-bdpxf

    下面将myapp滚动升级到V2版本

    / # while true; do wget -O - -q myapp; sleep 1; done
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

    master ~]# kubectl set image --help

    Usage:
    kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N

    [root@master ~]# kubectl get pods   //首先查看升级哪些pod
    NAME                           READY   STATUS      RESTARTS   AGE
    client                         0/1     Error       0          9d
    client1                        0/1     Completed   0          9d
    client2                        0/1     Error       0          119m
    client3                        1/1     Running     0          43m
    myapp-5bc569c47d-24qfh         1/1     Running     0          129m
    myapp-5bc569c47d-7ql96         1/1     Running     0          129m
    myapp-5bc569c47d-bdpxf         1/1     Running     0          55m
    nginx-deploy-55d8d67cf-hlj9v   1/1     Running     3          9d

    master ~]# kubectl describe pods myapp-5bc569c47d-24qfh   //可以显示升级容器的相关信息

    Name:               myapp-5bc569c47d-24qfh
    Namespace:          default
    Priority:           0
    PriorityClassName:  <none>
    Node:               node02/192.168.184.143
    Start Time:         Fri, 14 Jun 2019 09:28:42 +0800
    Labels:             pod-template-hash=5bc569c47d
                        run=myapp
    Annotations:        <none>
    Status:             Running
    IP:                 10.244.2.4
    Controlled By:      ReplicaSet/myapp-5bc569c47d
    Containers:  //容器名称
      myapp:
        Container ID:   docker://698843132d3a70585e8065470f97ae1d74ece31ae04749c57b9e93a66fe99d91
        Image:          ikubernetes/myapp:v1
        Image ID:       docker-pullable://ikubernetes/myapp@sha256:9c3dc30b5219788b2b8a4b065f548b922a34479577befb54b03330999d30d513
        Port:           <none>
        Host Port:      <none>
        State:          Running
          Started:      Fri, 14 Jun 2019 09:30:14 +0800
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-fckpp (ro)
    Conditions:
      Type              Status
      Initialized       True 
      Ready             True 
      ContainersReady   True 
      PodScheduled      True 
    Volumes:
      default-token-fckpp:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-fckpp
        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:          <none>

    修改控制器下面对应的容器,并指明所要升级到的镜像版本

    [root@master ~]# kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
    deployment.extensions/myapp image updated
    [root@master ~]# kubectl rollout status deployment myapp  //这里显示已经更新完成
    deployment "myapp" successfully rolled out

    此时控制器的版本已经升级到V2版本了

    / # while true; do wget -O - -q myapp; sleep 1; done
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

    此时查看各pod的名称,已经发生了改变

    [root@master ~]# kubectl get pods
    NAME                           READY   STATUS      RESTARTS   AGE
    client                         0/1     Error       0          10d
    client1                        0/1     Completed   0          9d
    client2                        0/1     Error       0          3h45m
    client3                        1/1     Running     0          149m
    myapp-86984b4c7c-24tmb         1/1     Running     0          97m
    myapp-86984b4c7c-clqhw         1/1     Running     0          96m
    myapp-86984b4c7c-crzfj         1/1     Running     0          97m
    nginx-deploy-55d8d67cf-hlj9v   1/1     Running     3          10d

    升级故障可以做回滚

    回滚有两种方法:

    1、直接修改版本

    master ~]# kubectl set image deployment myapp myapp=ikubernetes/myapp:v1

    2、使用命令

    master ~]# kubectl rollout --help

    Examples:
      # Rollback to the previous deployment
      kubectl rollout undo deployment/abc
      
      # Check the rollout status of a daemonset
      kubectl rollout status daemonset/foo
    
    Available Commands:
      history     View rollout history
      pause       Mark the provided resource as paused
      resume      Resume a paused resource
      status      Show the status of the rollout
      undo        Undo a previous rollout
    
    Usage:
      kubectl rollout SUBCOMMAND [options]
    
    Use "kubectl <command> --help" for more information about a given command.
    Use "kubectl options" for a list of global command-line options (applies to all commands).

    master ~]# kubectl rollout undo --help   //

    Usage:  //指明回滚到哪一个版本,如果不指明就回滚到上一个版本
    kubectl rollout undo (TYPE NAME | TYPE/NAME) [flags] [options]

    [root@master ~]# kubectl rollout undo deployment myapp
    deployment.extensions/myapp rolled back
    [root@master ~]# kubectl get pods
    NAME                           READY   STATUS        RESTARTS   AGE
    client3                        1/1     Running       0          157m
    myapp-5bc569c47d-5cdpw         1/1     Running       0          7s
    myapp-5bc569c47d-c4gr2         1/1     Running       0          11s
    myapp-5bc569c47d-njr5w         1/1     Running       0          9s    //上述三个是运行回滚后的版本的pod
    myapp-86984b4c7c-24tmb         0/1     Terminating   0          105m  //结束此前版本
    nginx-deploy-55d8d67cf-hlj9v   1/1     Running       3          10d
    / # while true; do wget -O - -q myapp; sleep 1; done  //此时已经运行的是V1版本了
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

    如果想要在进群外部(比如浏览器)访问集群服务,该如何做?

    可以将service类型修改为NodePort即可

    master ~]# kubectl edit svc myapp

    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: "2019-06-14T02:35:03Z"
      labels:
        run: myapp
      name: myapp
      namespace: default
      resourceVersion: "369638"
      selfLink: /api/v1/namespaces/default/services/myapp
      uid: 039652cc-8e4d-11e9-a017-000c29cef804
    spec:
      clusterIP: 10.96.152.130
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: myapp
      sessionAffinity: None
      type: ClusterIP   --> 将ClusterIP 修改为NodePort
    status:
      loadBalancer: {}

    修改成功后显示:service/myapp edited

    [root@master ~]# kubectl get svc
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        13d
    myapp        NodePort    10.96.152.130   <none>        80:30327/TCP   3h15m  //30327是每一个节点的这个端口都可以访问myapp
    nginx        ClusterIP   10.96.75.49     <none>        80/TCP         10d

    每一个节点都可以访问

        

    并且是负载均衡的

  • 相关阅读:
    MySQL Error--存储inode用完后报设备没有空间
    MySQL Binlog--基于ROW模式的binlog event大小限制
    MySQL Transaction--网络丢包导致长时间未提交事务
    java核心技术第四篇之JDBC第二篇
    java核心技术第三篇之JDBC第一篇
    java核心技术第二篇之数据库SQL语法
    JVM垃圾回收器原理及使用介绍
    JVM中优化指南
    MySQL常用工具、日志及读写分离
    java基础第十九篇之Xml
  • 原文地址:https://www.cnblogs.com/hanshanxiaoheshang/p/10969166.html
Copyright © 2011-2022 走看看