zoukankan      html  css  js  c++  java
  • K8s 入门

    中文文档:https://www.kubernetes.org.cn/kubernetes%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84

    小结大白话

    Portainer 挺好的,可以GUI管理集群。可以把很多机器(节点)加到 endpoint 中做集群管理;

    kubectl run和docker run一样,它能将一个镜像运行起来,我们使用kubectl run来将一个sonarqube的镜像启动起来。

    简介

    k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈,例如一个服务器挂了,可以自动将这个服务器上的服务调度到另外一个主机上进行运行,无需进行人工干涉。那么,问题来了,要运维何用?

    k8s可以更快的更新新版本,打包应用,更新的时候可以做到不用中断服务,服务器故障不用停机,从开发环境到测试环境到生产环境的迁移极其方便,一个配置文件搞定,一次生成image,到处运行。。。

    k8s的全生命周期管理

    在k8s进行管理应用的时候,基本步骤是:创建集群,部署应用,发布应用,扩展应用,更新应用。

    创建集群的好处就是,统一对外提供接口,无须进行各种复杂的调用;提供更好的可靠性,服务器宕机那么频繁,物理磁盘那么容易损坏,无须担心,集群统一进行调配;提供更好的性能,组合集群中各个机器的计算存储网络资源,提供更好的TPS和PS;提供横向扩容的能力,在进行横向扩容的时候,性能基本上能呈线性增长。

        在k8s里面,集群调度的最小单元就是一个pod,一个pod可以是一个容器,也可以是多个容器,例如你运行一个程序,其中使用了nginx,使用mysql了,使用了jetty,那么可以将这三个使用在同一个pod中,对他们提供统一的调配能力,一个pod只能运行在一个主机上,而一个主机上可以有多个pod。

    k8s有哪些同类产品

    对比Apache Mesos& Mesosphere Marathon

    什么是容器调度(Description of container schedulers)?

    ​ 容器调度工具的主要任务就是负责在最合适的主机上启动容器,并且将它们关联起来。它必须能够通过自动的故障转移(fail-overs)来处理错误,并且当一个实例不足以处理/计算数据时,它能够扩展容器来解决问题。

    对比OpenStack

    ​ Kubernetes是把OpenStack里面的VM换成了容器,但是实现地更漂亮,更精简,更抽象和本质化,用起来也更容易。

    Mac 实操k8s

    ./kubernetes.sh

    docker pull portainer/portainer # 可视化 docker

    单机版运行

    如果仅有一个docker宿主机,则可使用单机版运行,运行以下命令就可以启动了:

    » docker run -d -p 9000:9000 
        --restart=always 
        -v /var/run/docker.sock:/var/run/docker.sock 
        --name prtainer-test 
        portainer/portainer
    1eccf4fdf585935f434221aff5ca01856e3659aa208e1fad91626c610dc9841b
    

    本地需要加 -v /var/run/docker.sock:/var/run/docker.sock,远程的不需要

    账户 admin admin123

    在有多台Docker的情况下,进行集群管理就十分重要了,Portainer也支持集群管理,Portainer可以和Swarm一起来进行集群管理操作,Swarm搭建参考上文。

    本地情况

    运行K8S

    下载最新的 Docker for Mac 或者 Edge 版本,即可以看到内置的 Kubernetes 集群

    如果我们也勾选了 Show system containers 选项,那么使用如下的 Docker 命令,能看到自动安装的 Kubernetes 相关容器

    docker container ls --format "table{{.Names}} {{.Image }} {{.Command}}"

    关于各个容器的作用,可以参阅 这里 : https://github.com/kubernetes/kubernetes/tree/master/build

    创建 k8s 服务

    » kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.8.3/src/deploy/recommended/kubernetes-dashboard.yaml
    
    secret "kubernetes-dashboard-certs" created
    serviceaccount "kubernetes-dashboard" created
    role.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created
    rolebinding.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created
    deployment.apps "kubernetes-dashboard" created
    service "kubernetes-dashboard" created
    
    服务安装完毕后可以查看部署的容器与服务:
    
     » kubectl get services --namespace kube-system
    NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
    kube-dns               ClusterIP   10.96.0.10     <none>        53/UDP,53/TCP   7m
    kubernetes-dashboard   ClusterIP   10.106.47.35   <none>        443/TCP         20s
    --- Desktop/k8s » kubectl get deployments --namespace kube-system
    NAME                   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    kube-dns               1         1         1            1           7m
    kubernetes-dashboard   1         1         1            0           24s
    

    在 Dashboard 启动完毕后,可以使用 kubectl 提供的 Proxy 服务来访问该面板:

    $ kubectl proxy
    
    # 打开如下地址:
    # http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
    

    编辑 kubernetes-dashboard 服务
    kubectl -n kube-system edit service kubernetes-dashboar

    # 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:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kube-system"},"spec":{"ports":[{"port":443,"targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"}}}
      creationTimestamp: 2019-04-04T11:26:36Z
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kube-system
      resourceVersion: "919"
      selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
      uid: 8200fbdb-56cc-11e9-82da-025000000001
    spec:
      clusterIP: 10.106.47.35
      ports:
      - port: 443
        protocol: TCP
        targetPort: 8443
      selector:
        k8s-app: kubernetes-dashboard
      sessionAffinity: None
      type: ClusterIP
    status:
      loadBalancer: {}
    

    运行成功

    nohup kubectl proxy --address='0.0.0.0' --port=8888 --accept-hosts='*$'

    http://localhost:8888/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login

    k8s 集群

    docker 集群管理

    K8S 跑应用

    一、Deployment的概念
    K8S本身并不提供网络的功能,所以需要借助第三方网络插件进行部署K8S中的网络,以打通各个节点中容器的互通。
    POD,是K8S中的一个逻辑概念,K8S管理的是POD,一个POD中包含多个容器,容器之间通过localhost互通。而POD需要ip地址。每个POD都有一个标签

    POD–>RC–>RS–>Deployment (发展历程)

    总结创建的过程:

    (1)用户通过kubectl创建Deployment
    (2)Deployment创建ReplicaSet
    (3)ReplicaSet创建Pod

     » kubectl run net-test --image=alpine --replicas=2 sleep 36000  #创建名称为net-test的应用,镜像指定为alpine,副本数为2个
    deployment.apps "net-test" created
    
    » kubectl get pod -o wide                                                                                                                                                             127 ↵
    NAME                        READY     STATUS              RESTARTS   AGE       IP          NODE
    net-test-5cf9b5998c-cz8tg   0/1       ErrImagePull        0          1m        10.1.0.10   docker-for-desktop
    net-test-5cf9b5998c-qqq99   0/1       ContainerCreating   0          1m        <none>      docker-for-desktop
    
    » kubectl get deployment net-test
    NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    net-test   2         2         2            0           2m
    

    kubectl get deployment 命令可以查看net-test的状态,输出显示两个副本正常运行。还可以在创建的过程中,通过kubectl describe deployment net-test了解详细的信息。

    kubectl describe deployment net-test # 描述信息
    kubectl describe replicaset net-test-5cf9b5998c  #查看副本集的详细信息kubectl get replicaset  #获取副本集信息

    » kubectl create -f nginx-deployment.yaml                                        1 ↵
    deployment.apps "nginx-deployment" created
    ```
    
    kubectl get pod    #查看pod在状态,正在创建中,此时应该正在拉取镜像
    kubectl describe pod nginx-deployment-6c45fc49cb-62j4d  #查看具体某个pod的状态信息
    
    kubectl get pod -o wide  #创建成功,状态为Running
    
    kubectl scale deployment nginx-deployment --replicas 5  #对应用的副本数进行扩容,直接指定副本数为5
    
    
    ### 删除 k8s 的服务
    ```
    » kubectl get deployment
    NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    net-test           2         2         2            0           23m
    nginx-deployment   1         1         1            1           14m
    --- k8s/service » kubectl delete deployment net-test                                           130 ↵
    deployment.extensions "net-test" deleted
    ```
    
    ### 创建 k8s 服务 java
    ``` shell
     » kubectl create -f webapp-rc.yaml                                               1 ↵
    
    replicationcontroller "webapp" created
    ```
    
    获取Pod的IP地址:
    kubectl get pods -l app=webapp -o yaml|grep podIP
    直接通过这两个Pod的IP地址和端口号访问Tomcat服务:
    curl 172.17.0.2:8080
    
    kubectl create deployment nginx --image=nginx
    
    kubectl get deployments
    kubectl create service nodeport nginx --tcp 80:80
    kubectl get svc
    curl localhost:30354
    ![](https://i.iamlj.com/19-04-05/001729.png)
    
    » kubectl delete deployments/nginx services/nginx                                1 ↵
    deployment.extensions "nginx" deleted
    service "nginx" deleted
    
    ## 
    
    ### 其他
    
    获取dashboard token
    
    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kubernetes-dashboard-token|awk '{print $1}')|grep token:|awk '{print $2}'
    
    
    node 示例
     » docker build -t shliujing/kube-node-demo1:v1 .
    
    ## Kubernetes系列之五:使用yaml文件创建service向外暴露服务
    
    使用yaml文件创建Service(NodePort)
    » kubectl create -f service.yaml
    service "kube-node-service" created
    
    ![](https://i.iamlj.com/19-04-05/170933.png)
    
    ## 参考
    
    - k8s入门(kubernetes)--持续学习更新: https://blog.csdn.net/qq_35559756/article/details/81836814
    - 【可操作9分】MAC环境下Docker整合Kubernetes https://blog.csdn.net/WALK_MAN_wubiao/article/details/81351068
    - 【有用】Docker(七)----搭建Portainer可视化界面
    https://blog.csdn.net/u011781521/article/details/80469804
    - kubernetes的dashboard登录方式
     https://www.centos.bz/2018/07/kubernetes%E7%9A%84dashboard%E7%99%BB%E5%BD%95%E6%96%B9%E5%BC%8F/
    - 【有用】k8s技术预研8--深入掌握Kubernetes Service
    https://blog.csdn.net/watermelonbig/article/details/79693962
    - k8s部署服务——内部服务关联
     https://blog.csdn.net/u010955999/article/details/79448557
    - 【已成功】Kubernetes系列之三:部署你的第一个应用程序到k8s集群
     https://blog.csdn.net/wucong60/article/details/81458409 , https://blog.csdn.net/wucong60/article/details/81586272
     
    ## FAQ
    
    1. 登录不上仪表盘
    ![](https://i.iamlj.com/19-04-04/195605.png)
    使用这个版本有跳过,1.10版本的没有跳过,可以在[这里查看版本][1]
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.8.3/src/deploy/recommended/kubernetes-dashboard.yaml
    
    2. kube 创建的服务,ping 不通
    
    
    Go!!!
  • 相关阅读:
    hrbustoj 2283 heap解题报告
    hrbustoj 2013 Play Game 2(博弈)
    hrbustoj 2130 一笔画(状态压缩)
    hrbustoj 1125 循环小数 II(小数变分数+极限思想)
    FZU 2170 花生的序列(动态规划)
    FZU 2168 防守阵地 I(前n项和的前n项和)
    FZU 2107 Hua Rong Dao(暴力回溯)
    FZU 2122 又见LKity(KMP+返回所有匹配位置)
    socket
    osi七层协议2
  • 原文地址:https://www.cnblogs.com/shliujing/p/K8s-ru-men.html
Copyright © 2011-2022 走看看