zoukankan      html  css  js  c++  java
  • kubernetes_book

    v1.14

    所有机器:

    swapoff -a

    apt-get install docker.io

    apt-get update && apt-get install -y apt-transport-https curl
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
    cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
    deb https://apt.kubernetes.io/ kubernetes-xenial main
    EOF
    apt-get update
    apt-get install -y kubelet kubeadm kubectl
    apt-mark hold kubelet kubeadm kubectl

    systemctl enable docker.service

     

    master上执行:

    kubeadm init --kubernetes-version=v1.14.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=0.0.0.0

    mkdir -p $HOME/.kube                      #这样执行kubectl get cs不会报错

    cp -i /etc/kubernetes/admin.conf ~/.kube/config            #这样执行kubectl get cs不会报错,get cs == get compontsstatuses 验证其各组件的运行是否正常。

     

     

    验证:

    kubectl get cs    #get cs == get compontsstatuses 验证其各组件的运行是否正常。

    NAME                 STATUS    MESSAGE             ERROR

    scheduler            Healthy   ok                  

    controller-manager   Healthy   ok                  

    etcd-0               Healthy   {"health":"true"} 

    安装flannel网络:

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

     验证:

    kubectl get nodes会变成Ready状态

     kubectl get pods -n kube-system| grep flannel  #也会显示Running

    获取集群状态信息:

    kubectl cluster-info

    Kubernetes master is running at https://192.168.204.13:6443

    KubeDNS is running at https://192.168.204.13:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

     

    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

     

     

     

    kubectl version

    Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:53:57Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}

    Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:45:25Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}

     

     

     

     

    kubectl version --short=true

    Client Version: v1.14.0

    Server Version: v1.14.0

    集群重置:

    kubeadm reset

    查看所有集群:

    kubectl get nodes

     

    从集群移除节点:

    master上执行:

    kubectl drain NODE_ID --delete-local-data --force --ignore-daemonsets

    kubectl delete node NODE_ID

    node上执行:

    kubeadm reset

    2.3 kubectl常用命令:

    1.创建资源对象

    kubectl run nginx-deploy --image=nginx:1.12 --replicas=2

    kubectl expose deployment/nginx-deploy --name=nginx-svc --port=80

    curl 10.105.148.56

     

    也可以根据资源清单创建资源对象,

    kubectl create -f nginx-deploy.yaml -f nginx-svc.yaml

     

    还可以将创建交由kubectl自行确定,用户只需要生命期望的状态。假设存在定义了Deployment对象的nginx-deploy.yaml,以及定义了Service对象的nginx-svc.yaml文件,那么使用kubectl apply命令即可实现声明式配置:

    kubectl apply -f nginx-deploy.yaml -f nginx-svc.yaml

     

    2.查看资源对象

    列出所有的namespace资源对象

     kubectl get namespaces

    NAME              STATUS   AGE

    default           Active   4d1h

    kube-node-lease   Active   4d1h

    kube-public       Active   4d1h

    kube-system       Active   4d1h

     

    也可以一次查看多个资源类别下的资源对象,例如,列出默认名称空间内的所有pod和service对象

    kubectl get pods,services -o wide

    NAME                                READY   STATUS    RESTARTS   AGE   IP           NODE                 NOMINATED NODE   READINESS GATES

    pod/nginx-deploy-64d85b778b-h82wl   1/1     Running   0          14m   10.244.1.3   ip-192-168-204-252   <none>           <none>

    pod/nginx-deploy-64d85b778b-lssl4   1/1     Running   0          14m   10.244.2.3   ip-192-168-204-90    <none>           <none>

     

    NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE    SELECTOR

    service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   4d1h   <none>

    service/nginx-svc    ClusterIP   10.105.148.56   <none>        80/TCP    12m    run=nginx-deploy

     

     

     

    kubectl get pods,services

    NAME                                READY   STATUS    RESTARTS   AGE

    pod/nginx-deploy-64d85b778b-h82wl   1/1     Running   0          16m

    pod/nginx-deploy-64d85b778b-lssl4   1/1     Running   0          16m

     

    NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE

    service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   4d1h

    service/nginx-svc    ClusterIP   10.105.148.56   <none>        80/TCP    14m

     

     

    列出kube-namespace名称空间中拥有k8s-app标签名称的所有Pod对象。

    kubectl get pods -l k8s-app -n kube-system

    NAME                      READY   STATUS    RESTARTS   AGE

    coredns-fb8b8dccf-mcwrw   1/1     Running   0          4d1h

    coredns-fb8b8dccf-zv7mj   1/1     Running   0          4d1h

    kube-proxy-6lc26          1/1     Running   0          4d1h

    kube-proxy-7jgvg          1/1     Running   0          4d1h

    kube-proxy-zh4dc          1/1     Running   0          4d1h

     

     

    3.打印资源对象的详细信息

    kubectl -o {yaml|json}   或者 kubectl describe 都能打印出指定资源对象的详细描述信息。

    例如:查看kube-system名称空间中拥有标签component=kube-apiserver的Pod对象的资源配置清单(期望状态Spek)及当前的状态信息,并输出位yaml格式

    kubectl get pods -l component=kube-apiserver -o yaml -n kube-system

     

    而kubectl describe命令还能显示与当前对象相关的其他资源对象,如event,controller等。例如,查看kybe-system名称空间中拥有标签component=kube-apiserver的Pod对象的额详细描述信息:

    kubectl describe pods -l component=kube-apiserver -n kube-system

     

     

     

    4.打印容器中的日志信息

    例如:查看名称空间kube-system中仅有一个容器的Pod对象kube-apiserver-master.ilinux.io的日志

    kubectl logs kube-apiserver-master.ilinux.io -n kube-system

    如果添加-f选项,可以持续输出。

     

     

     

    5.在容器中执行命令

    例如在kube-system名称弓箭中的pod对象kube-apiserver-master.ilinux.io上的唯一容器中运行ps命令:

    kubectl exec kube-apiserver-master.ilinux.io -n kube-system -- ps

    如果pod对象中存在多个容器,则需要以-c选项,指定容器后再运行。

     

     

    6.删除资源对象

    对于受控于控制器的对象来说,删除之后其控制器可能会重建出类似的对象,例如,deployment控制旗下的epod对象在呗删除时就会被重建。

    例如:删除默认名称空间中名为nginx-svc的service资源对象

    kubectl delete services nginx-svc

     

    下面的命令可用于删除kube-system名称空间中拥有标签k8s-app=kube-proxy的所有pod对象

    kubectl delete pods -l app=monitor -n kube-system

     

    若要删除指定名称空间中的素有的某类对象,可以使用kubectl delete TYPE --all -n NS

    例如删除kube-public名称空间中的所有pod对象:

    kubectl delete pods --all -n kube-public

     

     

     

    2.4命令式容器应用编排

    采用示例镜像"ikubernetes/myapp:v1"来演示容器应用编排的基础操作:

    1.创建并管控pod对象以运行特定的应用程序。无状态(stateless)应用的部署和控制通常使用Deployment控制器进行,而有状态的应用则需要使用StatefulSet控制器

    2.为pod对象创建service对象。以便向客户端提供固定的访问路径,并借助于coredns进行服务发现。

    3.随时按需获取各资源对象的简要或详细信息,了解其运行状态。

    4.如有需要,则手动支持扩缩容的Controller组件进行扩容或缩容。

    5.滚动更新:当应用程序的镜像出现新版本时,对其执行更新操作,可以更新,回滚

     

     

    2.4.1部署应用pod

    1.创建deployment控制器对象

    kubectl run命令可于命令行直接创建deployment控制器,并以--image选项指定的镜像运行pod中的容器,--dry-run选项可用于命令的测试运行,但并未真正执行资源对象的创建过程。

    例如:创建一个名为myapp的deployment控制器对象,他使用镜像ikubenetes/myapp:v1创建pod对象,但仅在测试运行后马上退出。

     

    kubectl run myapp --image=ikubernetes/myapp:v1 --port=80 --replicas=1 --dry-run #测试,--port=80来指明容器要暴露的端口。

    kubectl run myapp --image=ikubernetes/myapp:v1 --port=80 --replicas=1 正式运行

    deployment资源对象通过ReplicaSet控制器实例完成对Pod对象的控制。而非直接控制。另外通过控制器创建的pod对象都会被自动附加一个标签。格式为“run=<Controller_Name>”。例如上面所创建的pod,会有"run=myapp"标签

     

    kubectl run 命令的其他选项:

    -l,--labels: 为pod对象设定自定义标签

    --record,是否将当前的对象创建命令保存至对象的annotation中,其值为true或false

    --save-config,是否将当前对象的配置信息保存至annotation中,其值为true或false

    --restart=Never,创建不受控制器管控的自主式pod对象

     

     

    2.打印资源对象的相关信息

    kubectl get deployments

    NAME           READY   UP-TO-DATE   AVAILABLE   AGE

    nginx-deploy   2/2     2            2           21h

     

    kubectl get deployments -o wide

    NAME           READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS     IMAGES                 SELECTOR

    myapp          1/1     1            1           73m   myapp          ikubernetes/myapp:v1   run=myapp

    nginx-deploy   2/2     2            2           23h   nginx-deploy   nginx:1.12             run=nginx-deploy

     

    root@ip-192-168-204-13:~# kubectl get pods

    NAME                            READY   STATUS    RESTARTS   AGE

    myapp-5c647497bf-pl4xj          1/1     Running   0          73m

    nginx-deploy-64d85b778b-h82wl   1/1     Running   0          23h

    nginx-deploy-64d85b778b-lssl4   1/1     Running   0          23h

    root@ip-192-168-204-13:~# kubectl get pods -o wide

    NAME                            READY   STATUS    RESTARTS   AGE   IP           NODE                 NOMINATED NODE   READINESS GATES

    myapp-5c647497bf-pl4xj          1/1     Running   0          73m   10.244.1.4   ip-192-168-204-252   <none>           <none>

    nginx-deploy-64d85b778b-h82wl   1/1     Running   0          23h   10.244.1.3   ip-192-168-204-252   <none>           <none>

    nginx-deploy-64d85b778b-lssl4   1/1     Running   0          23h   10.244.2.3   ip-192-168-204-90    <none>           <none>

     

     

    2.4.2探查pod及应用详情

    1.查看pod对象的详细描述

    kubectl describe pods xxxxx

    2.查看容器日志

    kubectl logs xxxxx

    3.在容器中运行额外的程序

    kubectl exec xxx ps aux

    进入容器的bash

    kubectl -it exec xxxxx /bin/sh

     

     

    2.4.3部署service对象

    一个service对象可视作通过标签选择器过滤出的一组pod对象。并为此组pod对象监听的套接字提供端口代理及调度服务。

    1.创建service对象

    kubectl expose命令可用于创建service对象以将应用程序暴露于网络中。

    例如,下面的命令即可将myapp创建的pod对象使用NodePort类型的服务暴露到集群外部

    kubectl expose deployments/myapp --type="NodePort" --port=80 --name=myapp               #type选项用于指定service的类型,port用于指定要暴露的容器端口,䯮service对象的名称为myapp

     

    然后通过

    kubectl get svc   获取myapp的端口号,比如30676

    curl 192.168.204.13:30676

    或者

    curl 10.109.187.139

     

    而上面的nginx-svc只能通过curl 10.105.148.56来访问

     

    例如:运行同一集群的pod对象中的客户端程序发起访问测试。kubectl run命令创建一个pod对象,myapp即service对象名称,default即其所属的namespace对象的名称:

    kubectl run client --image=bsybox --restart=Never -it -- /bin/sh

    wget -O - -q http://myapp.default:80

    创建时,service对象名称及其clusterIp会有coreDNS附件动态添加至名称解析库当中。因此,名称解析服务在对象创建后即可直接使用

     

    kubectl get svc/myapp

    NAME    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE

    myapp   NodePort   10.109.187.139   <none>        80:30676/TCP   44m

    ports字段表明,集群中各工作节点会补货发往本地的目标端口为30676的流量,转发至当前service对象的80端口。cluster-ip字段为当前service的IP地址,他是一个虚拟ip,并没有配置于集群中的任何主机的任何接口之上,但每个node之上的kube-proxy都会为cluster-ip所在的网络创建用于转发的iptables或ipvs规则。

     

    创建service对象的另一种方式是使用kubectl create service命令,对应于每个类型,分别有一个专用的自命令,例如kubectl create service clusterip,kubectl create service nodeport等。

     

    2.查看service资源对象的描述

    kubectl describe services myapp-svc

    Name:                     myapp

    Namespace:                default

    Labels:                   run=myapp

    Annotations:              <none>

    Selector:                 run=myapp

    Type:                     NodePort                 #其值可以是ClusterIP,NodePort和LoadBalancer等其中之一

    IP:                       10.109.187.139      #dangqian service对象的ClusterIp

    Port:                     <unset>  80/TCP      #暴露的端口,即当前service勇于接受并相应请求的端口

    TargetPort:               80/TCP            #容器中用于暴露的目标端口,由service port路由请求至此端口

    NodePort:                 <unset>  30676/TCP      #当前Service的NodePort,他是否存在有效值与type字段中的类型相等。

    Endpoints:                10.244.1.4:80        #后端端点,即被当前Service的Selector挑中的所有Pod的ip及端口

    Session Affinity:         None             #是否启用回话粘性

    External Traffic Policy:  Cluster            #外部流量的调度策略

    Events:                   <none>

     

    2.4.4扩容和缩容

    例如,如果要将myapp的pod副本数量扩展到3个

    kubectl scale deployments/myapp --replicas=3

    验证:

    kubectl get pods -l run=myapp

    kubectl describe deployments/myapp

    kubectl describe services/myapp

    while ture;do wget -O - -q http://myapp.default:80/hostname.html;sleep 1;done

     

    缩容:

    kubectl scale deployments/myapp --replicas=2

     

    2.4.5修改和删除对象

    kubectl edit services/myapp   #实时生效

    kubectl delete service myapp   #删除service

    kubectl delete deployment --all   #删除默认名称空间中所有的deployment控制器,需要注意的是,受控于控制器的pod对象在删除后会被重建。删除此类对象需要直接删除其控制器对象。不过,删除控制器时若不想删除其pod对象,可在删除命令上使用--cascade=false选项。

     

     

     

     

    3.1.1kubernetes资源对象

    1)工作负载型资源

    应用程序分为无状态和有状态两种类型。

    无状态应用:ReplicationController,ReplicaSet,Deployment

    有状态应用:StatefulSet.

    ReplicationController是上一代的控制器,其功能由ReplicaSet和Deployment负责时间,因此几近于废弃。

    负责收集日志或运行系统服务:DaemonSet控制器

    有些容器应用需要继续运行以为守护进程不间断提供服务,而有些则应该在正常完成后退出,这些在正常完成后就应该退出的容器化应用则由Job控制器负责管控。

    ReplicationController:用于确保每个Pod副本在任一适合均能满足目标数量,他是上一代的无状态pod应用控制器,建议使用Deployment和ReplicaSet来取代他

    ReplicaSet:新一代ReplicationController,与ReplicationController的唯一不同之处在于支持的标签选择器不同,Controller只支持等值选择器,而Set额外支持基于集合的选择器。

    Deployment:用于管理无状态的持久化应用,例如http服务器;用于为Pod和ReplicaSet提供声明式更新,是构建在ReplicaSet之上的更为高级的控制器。

    StatefulSet:用于管理有状态的持久化应用,如database服务程序;与deployment的不同之处在于statefulset会为每个pod创建一个独有的持久性标识符,并会确定各pod之间的顺序性。

    DaemonSet:用于确保每个节点都运行了某pod的一个副本,新增的节点一样会被添加此类pod。在节点移除时,此类pod会被回收。daemonSet常用语运行集群存储守护进程,如glusterd和ceph;还有日志收集进程,如fluentd和logstash;以及监控进程,如prometheus的node exporter,collectd,datadog agent和ganglia的gmond等

    job:用于管理运行完成后即可终止的应用,批处理作业任务。job创建一个或多个pod,并确保其符合目标数量,直到pod正常结束而终止。

     

     

    2)发现和负载均衡

    service资源和endpoint资源,以及通过七层代理实现请求流量负载均衡的ingress资源。

     

    3)配置与存储

    k8s设计了Volume资源,他支持众多类型的存储设备或存储系统,如glusterFs,CEPH RBD和Flocker等。

    ConfigMap资源能够以环境变量或存储卷的方式接入到Pod资源的容器中,并且可被多个同类的pod共享引用,从而实现一次修改,多处生效。

     

     

    3.1.2 api群组:

    kubectl api-versions

    admissionregistration.k8s.io/v1beta1

    apiextensions.k8s.io/v1beta1

    apiregistration.k8s.io/v1

    apiregistration.k8s.io/v1beta1

    apps/v1

    apps/v1beta1

    apps/v1beta2

    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

    certificates.k8s.io/v1beta1

    coordination.k8s.io/v1

    coordination.k8s.io/v1beta1

    events.k8s.io/v1beta1

    extensions/v1beta1

    networking.k8s.io/v1

    networking.k8s.io/v1beta1

    node.k8s.io/v1beta1

    policy/v1beta1

    rbac.authorization.k8s.io/v1

    rbac.authorization.k8s.io/v1beta1

    scheduling.k8s.io/v1

    scheduling.k8s.io/v1beta1

    storage.k8s.io/v1

    storage.k8s.io/v1beta1

    v1

     

     

    3.1.3访问k8s REST API

    启动proxy网关:

    kubectl proxy --port=8080     在本地启动一个代理网关,启动在127.0.0.1

    例如:请求k8s集群上的NamespaceList资源对象,即列出集群上所有的Namespace对象:

    curl localhost:8080/api/v1/namespaces/

     

    或者使用json的命令行处理器jq命令对相应的json数据流进行内容过滤,例如,显示相关的NamespaceList对象中的各成员对象:

    curl -s localhost:8080/api/v1/namespaces/ | jq .items[].metadata.name

    "default"

    "kube-node-lease"

    "kube-public"

    "kube-system"

     

    给出特定的Namespace资源对象的名称则能直接获取相应的资源信息,以kube-system名称空间为例:

    curl -s localhost:8080/api/v1/namespaces/kube-system

     

     

    3.2.1资源配置清单

    kubectl get TYPE/NAME -o yaml 命令也可以获取任何一个对象yaml格式的配置清单,或者使用 kubectl get TYPE/NAME -o json获取json格式的配置清单

    kubectl get namespace kube-system -o yaml

    apiVersion: v1

    kind: Namespace

    metadata:

      creationTimestamp: "2019-04-03T10:08:30Z"

      name: kube-system

      resourceVersion: "4"

      selfLink: /api/v1/namespaces/kube-system

      uid: 6e766e97-55f8-11e9-8325-0a7f67c6bece

    spec:

      finalizers:

      - kubernetes

    status:

      phase: Active

     

     

    例如,下面就是一个创建Namespace资源时提供的资源配置清单示例:

    apiVersion: v1

    kind: Namespace

    metadata:

      name: dev

    spec:

      finalizers:

      - kubernetes

    将上面的内容保存在文件中,使用kubectl create -f /path/file 就能将他创建到集群中。

     

     

     kubectl get deployment myapp -o yaml     #显示前面myapp的状态信息

    apiVersion: extensions/v1beta1

    kind: Deployment

    metadata:

      annotations:

        deployment.kubernetes.io/revision: "1"

      creationTimestamp: "2019-04-08T09:26:42Z"

      generation: 1

      labels:

        run: myapp

      name: myapp

      namespace: default

      resourceVersion: "623552"

     

     

    3.2.4 资源配置清单格式文档

    用户可以使用kubectl explain命令直接获取相关的使用帮助。例如要了解pod资源的一级字段,可以使用类似如下的命令,显示支持使用的各一组字段及其说明:

    kubectl explain pods

     

    需要了解某以及字段表示的对象之下的耳机对象字段时,只需要指定一级字段的对象名称。例如查看pod资源的spec对象支持嵌套使用的二级字段:

    kubectl explain pods.spec

     

     

    以现有活动对象的清单为模板可以更快的生成目标资源的配置文件,命令格式为kubectl get TYPE/NAME -o yaml --export      其中--export用于省略输出由系统生成的信息。

    例如,用现有的deployment资源对象myapp生成配置模板deploy-demo.yaml可以使用下面命令:

    kubectl get deployment myapp -o yaml --export > deploy-demo.yaml

     

     

     

     

     

     

  • 相关阅读:
    Selenium
    Selenium和ChromeDriver下载地址
    CQRS Event Sourcing介绍
    JAVA程序员面试30问(附带答案)
    拼多多、饿了么、蚂蚁金服Java面试题大集合
    40K刚面完Java岗,这些技术必须掌握
    接口测试之深入理解HTTPS
    选择了软件测试,你后悔吗?
    如何优雅的使用 Python 实现文件递归遍历
    刚从阿里回来,有些想法想跟测试员说说
  • 原文地址:https://www.cnblogs.com/alexhjl/p/10650876.html
Copyright © 2011-2022 走看看